使用DataContext.GetTable <t>()来获取'QueryProvider'</t>

时间:2010-11-26 19:15:12

标签: .net ddd-repositories cqrs

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数据库变量。

然而,问题是上面的问题,而不是其他问题。就像我说的,我只是在这里学习。这部电影不会影响制作代码。

1 个答案:

答案 0 :(得分:4)

您问题的简短回答是您的假设是正确的。您不能通过GetTable<>()的{​​{1}}方法访问数据库。而且,当你得到一个DataContext时,你也不会访问数据库,直到你枚举它为止。

此外,看看这是否有助于您完成任务:Advantage of creating a generic repository vs. specific repository for each object?