这是我提问here的问题的延续。
摘要:我有两个不同的数据库,只有很少的更改(一个表中缺少一个表和外键)我希望我的导入实用程序使用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>
,而无需从数据库中检索完整的表?
答案 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
}