DataContext.GetTable()方法将返回一个类型为
的对象System.Data.Linq.Table
通过这样做,我假设我没有发出对数据库的调用来检索整个表。否则,LINQ效率会低一些。
因此,我所做的就是深入了解我的强类型Datacontext类(例如,dbDataContext)以获取句柄,例如,它的“Customers”属性,表示SQL Server中的Customers表。
然后我可以从GetTable()返回的对象中获取IQueryable,但仍然没有命中数据库。即,我的“服务层”代码将是LINQ to Objects而不是Linq to Sql。
通过这一切,我将减少我需要的存储库数量。
上述假设是否正确?
我正在尝试找出一种使用接口和泛型来构建我的查询的方法,以使其可测试且完全可以。
所以,按照@ zowen的回应思路:
Repository pattern: One repository class for each entity?
我正在尝试实施
public interface IQueryProvider<T>
{
TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}
我知道并非绝对必要,但我正在学习曲线并查看适合我的建筑选项以及我的想法。
我正在尝试为SQL Server而不是MongoDb实现以下功能:
public class MongoQueryProvider<T> : IQueryProvider<T>
{
private readonly IMongoCollection<T> collection;
public MongoQueryProvider(IMongoDatabase database)
{
this.collection = database.GetCollection<T>();
}
public TResult Query<TResult>(Func<IQueryable<T>, TResult> query)
{
return query(this.collection.Linq());
}
}
我想要的是获取GetTable()的句柄,然后编写我的Service Layer Linq代码。
我怀疑我必须编写一个包装器接口来获取相当于IMongoDatabase数据库变量。
然而,问题是上面的问题,而不是其他问题。就像我说的,我只是在这里学习。这部电影不会影响制作代码。
答案 0 :(得分:4)
您问题的简短回答是您的假设是正确的。您不能通过GetTable<>()
的{{1}}方法访问数据库。而且,当你得到一个DataContext
时,你也不会访问数据库,直到你枚举它为止。
此外,看看这是否有助于您完成任务:Advantage of creating a generic repository vs. specific repository for each object?