1

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

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

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

现在我遇到了以下问题:

我从我的数据库上下文类中正确提取了接口:

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>. 然后如何在不从数据库中检索完整表的情况下Table<FieldCollection>Table<IFieldCollection>我的属性 getter中进行转换?

4

1 回答 1

2

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

现在,例如,如果您使用 a进行查询,.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
}
于 2013-05-24T10:01:15.023 回答