不确定这是否是最好的方法,但这是我的想法
我正在使用 Entity Framework 数据模型 v 4.1 - 我正在尝试动态构建一个 where 语句,这样我就不必每次都查询数据库,而是可以构建一个“条件列表”,然后将它们全部应用到一次所以数据库只被查询一次而不是每次我添加我的新条件 - 如果这有意义......
这是我的
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();
我不确定我在这里是否采取了正确的方法 - 希望这是有道理的 - 任何指导、示例代码都会很棒,我花了很多时间在网上找到这个例子/教程
最佳答案
您只需调用 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>>>
- 它们必须是表达式树而不是委托(delegate),以便 Entity Framework 可以处理它们。然后你可以这样做:
foreach (var predicate in predicates)
{
query = query.Where(predicate);
}
或者您可以使用 PredicateBuilder
构建单个表达式树。
关于c# - 动态构建 Func<t,t> 列表 - 然后应用于 linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7257761/