【问题标题】:Linq Expression that compare Lambda result with a constant将 Lambda 结果与常量进行比较的 Linq 表达式
【发布时间】:2013-06-05 13:41:16
【问题描述】:

我有一个计算属性

public decimal Avaibility
{
     get{ return l => l.Start - l.Uses.Sum(u => u.Amount);}
}

所以我不能在 linq 到实体的任何谓词中包含此属性,例如

Products.Where(l => l.Avaibility> 0);

我目前的解决方案是在我需要的任何地方重复 lambda,但这是不可维护的,我想达到类似的东西

private Expression AvaibilityCalculation = l => l.Start - l.Uses.Sum(u => u.Amount);
public decimal Avaibility
{
    get{ return AvaibilityCalculation.Compile()(this/*product*/) ;}
}
public Product ProductsWithStock()
{
          //for l => l.Start - l.Uses.Sum(u => u.Amount) > 0
   return Products.Where(AvaibilityCalculation.GreaterThan(Expression.Constant(0, typeof(decimal))) );
}

有什么想法吗?

【问题讨论】:

    标签: linq entity-framework linq-to-entities expression


    【解决方案1】:

    您可以在每次保存时重新计算您的计算值,并将其作为额外列添加到您的表格中。如果您要进行大量查询,这不仅会使您的 linq 语句更易于使用,而且性能也应该更好(计算一次)。

    【讨论】:

    • 我的 linq 性能没问题,我需要的是更好的易用性和可维护性
    【解决方案2】:

    您可以创建一个返回表达式的方法:

    public Expression<Func<Product,bool>> AvailablityCompareTo
                                                      (bool greaterThan, int amount)
    {
        if (greaterThan)
            return l => l.Start - l.Uses.Sum(u => u.Amount) >= amount;
        else
            return l => l.Start - l.Uses.Sum(u => u.Amount) <= amount;
    }
    

    用法:

    Products.Where(AvailablityCompareTo(true,0))
    

    这是一个没有表达式的简单解决方案voodoo,仍然有点重复,但仅限于方法内部。

    【讨论】:

    • 它实际上不起作用引发异常,因为 linq 实体无法映射您在这种情况下使用的 MethodCallExpression,除此之外我无法使用表达式来计算可用性,谢谢任何方式
    • 您能否详细介绍一下您是如何使用它的?我在 EF 中使用类似的构造没有问题。它被翻译成 SQL。
    • Product.Where(p=> AvaibilityCalculation (p)> 0),记住我还需要 AvaibilityCalculation 的十进制值用于 Avaibility 属性中的其他用途
    • 您必须使用语法Where(AvailablityCompareTo(true,0))。如果您需要其他地方的值,您可以使用变量。
    • 它将产生三行,其中 lambda 2 为您指定的方法,另一行为 Avaibility 属性,我需要指定 lambda l => l.Start - l.Uses.Sum(u => u.Amount) 只是一次保持我的代码的可维护性,这是一个质量代码问题
    猜你喜欢
    • 2011-04-24
    • 2010-11-28
    • 2022-11-28
    • 1970-01-01
    • 2020-07-29
    • 2022-08-13
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    相关资源
    最近更新 更多