3

DataContext.GetTable() 方法将返回一个对象类型:

System.Data.Linq.Table

通过这样做,我假设我没有调用数据库来检索整个表。否则,LINQ 会有些低效。

因此,我所做的只是深入研究我的强类型 Datacontext 类(例如,dbDataContext)以获取例如它的“Customers”属性的句柄,该属性代表 SQL Server 中的 Customers 表。

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

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

问题:

上述假设是否正确?

笔记:

我正在尝试找出一种方法来使用接口和泛型构建我的查询,以使其可测试以及所有这些。

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

存储库模式:每个实体一个存储库类?

我正在尝试实施

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() 的句柄,然后针对它编写我的服务层 Linq 代码。

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

但是,问题是上述问题,而不是其他问题。就像我说的,我只是在这里学习。在这部电影中,任何生产代码都不会受到伤害。

4

1 回答 1

4

对您的问题的简短回答是您的假设是正确的。您不GetTable<>()通过DataContext. 而且,当您获得 an 时,IQueryable您也不会访问数据库,直到您对其进行枚举。

另外,看看这是否对您的任务有所帮助: 为每个对象创建通用存储库与特定存储库的优势?

于 2010-11-26T21:14:40.890 回答