1

我有一个计算好的属性

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

任何想法?

4

2 回答 2

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

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

于 2013-06-05T14:11:11.630 回答
0

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

于 2013-06-05T13:46:46.983 回答