c# - 如何在属性中存储 Linq where 条件

标签 c# entity-framework linq expression-trees

我想知道在参数中存储实体条件的最可维护方式(如果存在),以便在每个 linq where 条件中重用它。

假设有一个 Product 实体:

public class Product
{
    public bool IsDiscontinued { get; set; }

    public int UnitsInStock { get; set; }
}

我想向 Product 类添加一个属性 IsOnSale,该属性包含确定产品是否打折的逻辑。 在这个简单的例子中,逻辑可以是:

IsOnSale = IsDiscontinued == false && UnitsInStock > 0

那么我应该能够编写这种类型的 linq 查询:

from p in context.Products
where p.IsOnSale == true
select p

解决方案的目的应该是,如果将来确定产品是否正在销售的逻辑发生变化(例如添加属性 IsBackOrderAllowed),我不必到处编辑 linq 查询,只需简单地必须更改 IsOnSale 属性。

已发布类似问题here但似乎解决了一个更具体的问题。

最佳答案

您可以创建一个方法来返回按您的条件过滤的 IQueryable:

public IQueryable<Product> WhereOnSale(this IQueryable<Product> source)
{
    return source.Where(p => p.IsDiscontinued == false && p.UnitsInStock > 0);
}

你会像这样使用它:

from p in context.Products.WhereOnSale()
select p

如果你想用像 Yakimych 的回答那样的表达式来做,那么这会起作用:

Expression<Func<Product, bool>> isOnSale = 
(p => p.IsDiscontinued == false && p.UnitsInStock > 0);

你可以像这样使用它:

context.Products.Where(isOnSale)

将其声明为表达式很重要,否则 Entity Framework 将无法将其转换为 SQL,因为 lambda 将被编译为 IL 而不是表达式树。

关于c# - 如何在属性中存储 Linq where 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5323959/

相关文章:

c# - EF 4.3 使用本地缓存而不是从数据库中重新获取

c# - 使用 Entity Framework 是否有更简洁或优雅的方法将多个参数传递给 SQL 存储过程?

c# - 从 CSV 文件中提取数据(融合表和 kml 解决方法)

c# - 使用 LINQ 在对象图中的所有属性中查找关键字

c# - "Handler"模式?

c# - 如何将 XAML 插入 RichTextBox?

消息模式下的 C# Named Pipes 有时会合并消息?

asp.net-mvc - 在 Entity Framework MVC 中更新子实体

c# - 复杂分组依据

c# - 多线程中的入队和出队