我有一个计算属性
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))) );
}
有什么想法吗?
答案 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))
这是一个简单的解决方案,没有表达伏都教,仍然有点重复,但只在方法内部。