动态构建Func <t,t>列表 - 然后应用于linq查询

998*_*823 2 c# linq asp.net delegates entity-framework-4

不确定这是否是最佳方法,但这是我的想法

我正在使用实体框架数据模型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();
Run Code Online (Sandbox Code Playgroud)

我不确定我是否在这里采取正确的方法 - 希望这是有道理的 - 任何指导,示例代码都会很棒,我有一点时间在线查找示例/教程

Jon*_*eet 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();
Run Code Online (Sandbox Code Playgroud)

在您开始尝试检索结果之前,它不会联系数据库.

如果你真的想创建一个列表,你需要创建一个List<Expression<Func<Order, bool>>>- 它们必须是表达式树而不是委托,以便实体框架可以处理它们.然后你可以这样做:

foreach (var predicate in predicates)
{
    query = query.Where(predicate);
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用PredicateBuilder构建单个表达式树.