2013-06-05 59 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