2013-06-05 25 views
1

LINQ表达式我有一个计算的属性是比较LAMBDA结果以恒定

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

,所以我不能包括任何谓词LINQ到实体此属性像

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

我目前的解决方案任何地方,我需要它,但不是维护重复拉姆达,我要像达到什么

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

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

+0

我很满意我的linq性能,我需要它更容易使用和可保持性 – cyberdantes

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

这是毫无表情巫术一个简单的解决方案,还是有点重复,但只有在方法内部。

+0

事实上这不是工作抛出一个异常,因为linq实体无法映射MethodCallExpression,这就是你在这里使用的除此之外,我无法使用表达式来计算可用性,谢谢任何方式 – cyberdantes

+0

您能否详细说明如何使用它?我使用EF的类似构造没有任何问题。它被转换为SQL。 –

+0

Product.Where(P => AvaibilityCalculation(P)> 0),请记住,我还需要AvaibilityCalculation的在Avaibility财产的其他目的十进制值 – cyberdantes