不确定这是否是最佳方法,但这是我的想法
我正在使用实体框架数据模型v 4.1 - 我正在尝试动态构建一个where语句,这样我就不必每次都查询db,而是可以构建一个“条件列表”,然后将它们全部应用于一旦这样,db只被查询一次,而不是每次我添加我的新条件 - 如果这是有道理的......
这是我的
List<Func<Order, bool>> orderFunctions = new List<Func<Order, bool>>();
if (this.LoggedInUser.UserId == 9)
{
Func<Order, bool> deleg = o => o.Status.Equals(OrderStatus.NewOrder);
orderFunctions.Add(deleg);
}
else if (this.LoggedInUser.UserId == 22)
{
Func<Order, bool> deleg = o => o.AssignedToUserId.Equals(22);
orderFunctions.Add(deleg);
}
List<Orders> orders = Entities.Orders.Where( Some How Apply my Order Functions List Here ).ToList();
我不确定我是否在这里采取正确的方法 - 希望这是有道理的 - 任何指导,示例代码都会很棒,我有一点时间在线查找示例/教程< / p>
答案 0 :(得分:6)
您只需多次拨打Where
即可完成此操作:
IQueryable<Order> query = Entities.Orders;
if (this.LoggedInUser.UserId == 9)
{
query = query.Where(o => o.Status.Equals(OrderStatus.NewOrder));
}
else if (this.LoggedInUser.UserId == 22)
{
query = query.Where(o => o.AssignedToUserId.Equals(22));
}
List<Order> orders = query.ToList();
在您开始尝试检索结果之前,它不会与数据库联系。
如果确实想要创建列表,则需要创建一个List<Expression<Func<Order, bool>>>
- 它们必须是表达式树而不是委托,以便实体框架可以处理他们。然后你可以这样做:
foreach (var predicate in predicates)
{
query = query.Where(predicate);
}
或者您可以使用PredicateBuilder
构建单个表达式树。
答案 1 :(得分:2)
但是对于你原来的观点,以及为什么这不起作用:
应用孔列表并不困难(只需执行
)x => orderFunctions.All(f => f(x))
)但你不会得到任何SQL爱 - 这意味着你会得到一个错误,因为EF不知道如何处理所有(或者你将在那里编码)。 您将不得不查询所有条目(使用ToList或ToArray),之后它将起作用......但没有性能;)