使用接口对两个不同的数据上下文进行LINQ处理
本文关键字:数据 上下文 处理 LINQ 两个 接口 | 更新日期: 2023-09-27 18:15:14
这是我刚才问的问题的延续。
简要总结:我有两个不同的数据库,变化最小(一个表和外键在一个表中丢失),我希望我的导入实用程序使用Linq-To-Sql能够用数据填充两个数据库,而不重复逻辑。
我的第一种方法是使用dynamic
在单个变量中存储两个不同的数据库上下文,但这种方法不起作用,建议我为此使用接口。
现在我碰到了下面的问题:
我正确地从我的db上下文类中提取接口:
public interface IDataContext
{
System.Data.Linq.Table<IFieldCollection> FieldCollections { get; }
System.Data.Linq.Table<IField> Fields { get; }
}
…但是为了能够通过两个不同的数据库上下文类实现接口,我不得不将实际的LINQ类(FieldCollection
, Field
)也替换为接口。
现在我有问题返回Table<IFieldCollection>
或Table<IField>
在我的类实现。db上下文类的自动生成代码如下:
public System.Data.Linq.Table<FieldCollection> FieldCollections
{
get
{
return this.GetTable<FieldCollection>();
}
}
因此,为了实现IDataContext
,我需要将返回值更改为Table<IFieldCollection>
。然后我如何在我的属性getter 中转换Table<FieldCollection>
到Table<IFieldCollection>
而不从数据库检索完整的表?
在我的testapp中,下面的代码似乎可以工作。
定义你的接口:
public interface IDataContext {
IQueryable<IFieldCollection> FieldCollections { get; }
IQueryable<IField> Fields { get; }
}
使用以下实现更新数据上下文:
public partial class DataContext1: IDataContext {
IQueryable<IFieldCollection> IDataContext.FieldCollections {
get { return FieldCollections; }
}
IQueryable<IField> IDataContext.Fields {
get { return Fields; }
}
}
现在,如果您使用.Where(<predicate>).FirstOrDefault()
进行查询,那么查询将被正确编译,并在SQL中使用相应的WHERE。
using (IDataContext context = MyDataContextFactory.GetInstance() /* or something else */) {
var fieldsCount = context.Fields.Where(x => x.Id == 1).Count();
// The predicate Id == 1 and Count() are translated to sql
}