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