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

标签 c# asp.net linq entity-framework-4 delegates

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

我正在使用 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/

相关文章:

c# - 使用 LINQ to SQL 添加记录的问题

html - 从下拉菜单中隐藏选择标记栏

希望进入 SharePoint 的 ASP.NET 开发人员 - 2007 或 2010?

c# - 存储过程获取不到参数

linq - 对于业余爱好者来说,学习 LINQ 值得吗?

c# - 无法将 lambda 表达式转换为类型 'string',因为它不是委托(delegate)类型

c# - Entity Framework 代码优先 : cycles or multiple cascade paths

c# - Process.Start 使用 UAC on 的不同凭据

c# - C# 中的计时器无法正常工作

c# - LINQ:如何选择子节点满足条件的项目元素?