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

时间:2013-05-24 09:33:39

标签: c# linq generics interface

这是我提问here的问题的延续。

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

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

现在我遇到了以下问题:

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

public interface IDataContext
{
    System.Data.Linq.Table<IFieldCollection> FieldCollections { get; }
    System.Data.Linq.Table<IField> Fields { get; }
}

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

现在我在类实现中返回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>,而无需从数据库中检索完整的表

1 个答案:

答案 0 :(得分:2)

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

像这样定义你的界面:

public interface IDataContext {
    IQueryable<IFieldCollection> FieldCollections { get; }
    IQueryable<IField> Fields { get; }
}

使用以下实现更新datacontexts:

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
}