代码之家  ›  专栏  ›  技术社区  ›  awrigley

使用dataContext.gettable获取“queryProvider”

  •  3
  • awrigley  · 技术社区  · 15 年前

    dataContext.getTable()方法将返回类型为的对象:

    system.data.linq.表

    通过这样做,我想我还没有对数据库发出调用来检索整个表。否则,Linq会有些效率低下。

    因此,我所做的一切就是钻取到我的强类型DataContext类(例如,DBDataContext)中,以获取其表示SQL Server中客户表的“客户”属性的句柄。

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

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

    问题:

    上述假设是否正确?

    注:

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

    因此,按照@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()的句柄,然后针对它编写服务层LINQ代码。

    我怀疑我必须编写一个包装器接口来获得相当于imongodatabase数据库变量的值。

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

    1 回复  |  直到 15 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    对你的问题的简短回答是你的假设是正确的。您不能通过 GetTable<>() 方法 DataContext . 当你得到一个 IQueryable 在枚举数据库之前,您也不能访问它。

    另外,看看这是否有助于你的任务: Advantage of creating a generic repository vs. specific repository for each object?

    推荐文章