【问题标题】:Creating a Data Access Layer with dynamic query building capabilities创建具有动态查询构建功能的数据访问层
【发布时间】:2013-05-09 18:53:14
【问题描述】:

我在我的数据访问层中使用实体框架,我需要支持通过 UI 构建动态查询(例如(Name == "John" AND Age > 25).TOP(100).ORDERBY(LastName))。

我打算使用QueryBuilder 来创建动态查询。为此,我正在考虑创建如下结构:

  1. 我的业务实体层中的一个FilterCondition 类,它可以包含Name is equal to John 之类的条件。
  2. FilterConditionsToQuerysomewhere,它将List<FilterCondition> 转换为使用QueryBuilder 的查询。

我应该在数据访问层中创建FilterConditionsToQuery 类并在我的 UI 层中直接引用它,还是应该创建一个存储库?对于 MVVM WPF 应用程序来说,更好的方法是什么?

【问题讨论】:

  • 为此您不需要存储库。
  • @MikeSW,我的意思是“我应该在我的存储库中实现该功能吗?”,抱歉它含糊不清。
  • 您仍然不需要存储库 :) EF 通过 LINQ 进行动态查询。实施 repo 意味着您必须创建自己的 FIlterCONditions 需要“转换”为 Linq。如果您不想与 EF 耦合,repo 可以帮助您的唯一情况是。但是这里有很多工作,我不知道是否值得
  • @MikeSW,我知道这一点。我的意思是存储库将以某种方式实现。是否实施不是我想做的决定。

标签: c# entity-framework architecture repository-pattern query-builder


【解决方案1】:

如果您愿意,可以使用 func 委托来实现。 第一个func参数是where子句,第二个是top参数,第三个是orderby子句

程序.cs

 var dal = new DataAccessLayer();
 var result = dal.Get(x => x.Age > 40, 5, x2 => x2.Firstname);
 //var result = dal.Get(x => x.Age > 40 && x.Firstname == "Dave", 5, x2 => x2.Firstname);

DataAccessLayer.cs

public IEnumerable<Student> Get(Func<Student, bool> expr, int top, Func<Student, object> orderBy )
{
    var list = GetStudents();
    return list.Where(expr).Take(top).OrderBy(orderBy);
}

【讨论】:

  • 但是查询是动态创建的,所以我需要在某个地方动态创建Func,这会增加一个额外的层。
  • 您动态创建的查询是什么样的?构造的实体 sql 字符串?字典?
  • 它们将是部分构造的实体 SQL 字符串。我将使用ObjectQuery 类。
猜你喜欢
  • 2018-11-19
  • 2019-07-31
  • 2011-07-24
  • 2019-06-25
  • 2011-07-28
  • 2019-11-24
  • 1970-01-01
  • 2014-07-31
  • 1970-01-01
相关资源
最近更新 更多