C# 针对动态对象的LINQ

C# 针对动态对象的LINQ,c#,linq-to-sql,dynamic,C#,Linq To Sql,Dynamic,我正在实现一个导入工具,从文件中读取数据并将其存储到数据库中。我们有两个不同版本的数据库:“完整”版本和“轻量级”版本。轻量级版本少了一个表,加上引用缺少的表的其他四个表也没有这个外键列 我已经使用LINQtoSQL实现了将数据导入“完整”数据库的工具,并且我想重新使用导入数据库轻量级版本的逻辑 我的想法是为此使用动态对象 因此,我在项目中添加了两个不同的Linq To SQL.dbml文件,并用相应的表填充它们。我将它们设置为使用不同的名称空间,以避免名称冲突 初始化动态变量的DbContex

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

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

我的想法是为此使用
动态
对象

因此,我在项目中添加了两个不同的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
的类型(并且不是
动态的


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

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

像这样:

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

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

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

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

像这样:

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

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

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

使用
dynamic
通常是坏代码的标志。不总是,但经常。@SLaks:我遇到了另一个问题,请看这里的新问题:使用
动态
通常是坏代码的标志。不总是,但经常。@SLaks:我遇到了另一个问题,请看这里的新问题:您的解决方案不起作用,因为我无法返回
DbSet
,我需要返回一个由
InstanceOfFirstDbContext
InstanceOffSecondBCContext
实现的接口,在这里查看我的新问题:您的解决方案不起作用,因为我无法返回
DbSet
,我需要返回一个将由
InstanceOfFirstDbContext
InstanceOffSecondBContext
实现的接口,请在这里查看我的新问题: