LINQ针对动态对象

时间:2013-05-23 16:04:17

标签: c# linq-to-sql dynamic

我正在实现一个导入工具,它从文件中读取数据并将它们存储到数据库中。我们有两个不同版本的数据库:“完整版”和“轻量级”版本。轻量级版本有一个表少,另外四个表引用缺少的表也没有这个外键列。

我已经实现了使用Linq-to-Sql将数据导入“完整”数据库的工具,我想重新使用逻辑导入数据库的轻量级版本。

我的想法是为此目的使用dynamic个对象。

所以我在项目中添加了两个不同的Linq-To-SQL .dbml文件,并用相应的表填充它们。我将它们设置为使用不同的命名空间以避免名称冲突。

我没有问题来初始化动态变量的DbContext(至少我没有得到任何编译器错误):

            bool _usefirstdb; 
            dynamic _db;
            if (_usefirstdb) 
            {
                _db =  new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2]));
            }
            else
            {
                _db =  new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2]));
            }

但是我遇到了针对这些对象运行LINQ查询的问题:

      var query = from inst in _db.Instances
                  where inst.Name.Equals(args[3])
                  select inst.Id;

这是因为编译器无法确定inst的类型(并且不是dynamic)。

有没有办法克服这个问题?我知道C#是静态类型的,但我没有看到任何其他方法来重用我的代码...

1 个答案:

答案 0 :(得分:1)

当两个DbContext类实现相同的接口时,您可以将引用作为该接口。在你的界面中,你保留了两个上下文都有的DbSet。然后,当您使用linq时,您只能查询这些集合,它仍然是类型安全的。

像这样:

public interface IInstances
{
    DbSet<Instance> Instances { get; }
}

public FirstDBDataContext :DbContext, IInstances
{
    //Normal implementation
}

public SecondDBDataContext :DbContext, IInstances
{
    //Normal implementation
}

bool _usefirstdb; 
IInstances _db;
if (_usefirstdb) 
{
    _db =  new FirstDBDataContext (string.Format(SqlScripts.SqlServerConnectionString, args[1], args[2]));
}
else
{
    _db =  new SecondDBDataContext(string.Format(SqlScripts.SqlServerConnectionString,args[1], args[2]));
}

var query = from inst in _db.Instances
    where inst.Name.Equals(args[3])
    select inst.Id;
相关问题