【问题标题】:LINQ against dynamic object针对动态对象的 LINQ
【发布时间】:2013-05-24 00:19:40
【问题描述】:

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

我已经实现了使用 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# 是静态类型的,但我没有看到任何其他方式来重用我的代码...

【问题讨论】:

标签: c# linq-to-sql dynamic


【解决方案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;

【讨论】:

  • 您的解决方案行不通,因为我无法返回DbSet&lt;Instance&gt;,我需要返回一个由InstanceOfFirstDbContextInstanceOfSecondDbContext 实现的接口,请在此处查看我的新问题:stackoverflow.com/questions/16731814/…
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多