使用接口对两个不同的数据上下文进行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>而不从数据库检索完整的表?

使用接口对两个不同的数据上下文进行LINQ处理

在我的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
}