Linq表达式将Lambda结果与常量进行比较

时间:2013-06-05 13:41:17

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

我有一个计算属性

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))) );
}

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您可以使用每次保存重新计算计算值,并将其作为额外列添加到表中。如果你要查询它很多,这不仅会使你的linq语句更容易使用,而且它也应该表现更好(计算一次)。

答案 1 :(得分:0)

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

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))

这是一个简单的解决方案,没有表达伏都教,仍然有点重复,但只在方法内部。