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)
我不确定我是否在这里采取正确的方法 - 希望这是有道理的 - 任何指导,示例代码都会很棒,我有一点时间在线查找示例/教程
你可以通过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构建单个表达式树.
| 归档时间: |
|
| 查看次数: |
1524 次 |
| 最近记录: |