.net 使用DataContext.GetTable<;T>;()获得';查询提供程序&x27;

.net 使用DataContext.GetTable<;T>;()获得';查询提供程序&x27;,.net,ddd-repositories,cqrs,.net,Ddd Repositories,Cqrs,DataContext.GetTable()方法将返回以下类型的对象: System.Data.Linq.Table 通过这样做,我假定我没有向数据库发出检索整个表的调用。否则,LINQ将有点效率低下 因此,我所做的就是钻取我的强类型Datacontext类(例如,dbDataContext)以获取其“Customers”属性的句柄,该属性表示SQL Server中的Customers表 然后,我可以从GetTable()返回的对象中获取IQueryable,但仍然没有命中数据库。也就是说,我的

DataContext.GetTable()方法将返回以下类型的对象:

System.Data.Linq.Table

通过这样做,我假定我没有向数据库发出检索整个表的调用。否则,LINQ将有点效率低下

因此,我所做的就是钻取我的强类型Datacontext类(例如,dbDataContext)以获取其“Customers”属性的句柄,该属性表示SQL Server中的Customers表

然后,我可以从GetTable()返回的对象中获取IQueryable,但仍然没有命中数据库。也就是说,我的“服务层”代码将是LINQ到对象,而不是LINQ到Sql

通过这样做,我将减少我需要的存储库的数量

问题: 上述假设是否正确

注意: 我正试图找到一种方法来使用接口和泛型构建我的查询,以使其可测试,等等

因此,按照@zowen对以下内容的回应:

我正在努力实施

public interface IQueryProvider<T>
{
     TResult Query<TResult>(Func<IQueryable<T>, TResult> query);
}
公共接口提供程序
{
TResult查询(Func查询);
}
我知道这并不是绝对必要的,但我正在经历学习过程,看看适合我的架构选项和我的思考方式

我想做的是: 我正在尝试为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());
    }
}
公共类MongoQueryProvider:IQueryProvider
{
私人只读IMongoCollection;
公共MongoQueryProvider(IMongoDatabase)
{
this.collection=database.GetCollection();
}
公共TResult查询(Func查询)
{
返回查询(this.collection.Linq());
}
}
我想要的是获得GetTable()的句柄,然后针对该句柄编写服务层Linq代码

我怀疑我将不得不编写一个包装器接口来获得IMongoDatabase数据库变量的等价物


然而,问题就在上面,而不是另一个问题。就像我说的,我只是在这里学习。在这部电影中,任何制作代码都不会受到影响。

对您的问题的简短回答是您的假设是正确的。您不能通过
DataContext
GetTable()
方法访问数据库。而且,当您获得一个
IQueryable
时,您也不会访问数据库,直到您在其上枚举为止


另外,看看这是否对您的任务有帮助:

您确实可以通过GetTable()访问数据库。。。这是EntityFramework上存储库实现的主要强类型网关方法。@jfar:您没有抓住要点,显然没有阅读问题:问题不在于GetTable()是否是访问数据的一部分,而在于调用此方法是否检索数据。这个问题回答正确,所以我建议你取消对雷姆斯答案的反对票。