LINQ使用接口对抗两个不同的数据上下文

这是我在这里提出的问题的延续。

简介:我有两个不同的数据库,只有很少的更改(一个表中缺少一个表和外键),我希望我的导入实用程序使用Linq-To-Sql能够使用数据填充这两个数据库,而不会重复逻辑。

我的第一种方法是在单个变量中使用dynamic存储两个不同的数据库上下文,但这种方法不起作用,我建议使用接口来实现此目的。

现在我碰到了以下问题:

我正确地从我的db上下文类中提取了接口:

 public interface IDataContext { System.Data.Linq.Table FieldCollections { get; } System.Data.Linq.Table Fields { get; } } 

…但是为了能够通过两个不同的数据库上下文类实现接口,我不得不用实际的LINQ类( FieldCollectionField )替换接口。

现在我在我的类实现中返回TableTable遇到问题。 db上下文类的自动生成代码如下:

  public System.Data.Linq.Table FieldCollections { get { return this.GetTable(); } } 

所以,为了在这里实现IDataContext ,我需要将返回值更改为Table 。 如何在我的属性getter Table TableTable 而不从数据库中检索完整的表

在我的testapp中,以下似乎有效。

像这样定义你的界面:

 public interface IDataContext { IQueryable FieldCollections { get; } IQueryable Fields { get; } } 

使用以下实现更新datacontexts:

 public partial class DataContext1: IDataContext { IQueryable IDataContext.FieldCollections { get { return FieldCollections; } } IQueryable IDataContext.Fields { get { return Fields; } } } 

现在,如果您查询,例如,使用.Where(

).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 }