2010-05-24 22 views
10

我正在爲我的一個核心L2S類構建一個函數庫,它們都返回一個bool以允許檢查某些情況。LINQ to SQL:注意預構建表達式

例子:

Expression<Func<Account, bool>> IsSomethingX = 
     a => a.AccountSupplementary != null 
     && a.AccountSupplementary.SomethingXFlag != null 
     && a.AccountSupplementary.SomethingXFlag.Value; 

現在,來查詢這不是真的,我不能做到這一點:

var myAccounts= context.Accounts 
     .Where(!IsSomethingX); // does not compile 

然而,使用從PredicateBuilder類的語法,我來與此:

public static IQueryable<T> WhereNot<T>(this IQueryable<T> items, 
     Expression<Func<T, bool>> expr1) 
{ 
    var invokedExpr = Expression.Invoke(expr1, expr1.Parameters.Cast<Expression>()); 
    return items.Where(Expression.Lambda<Func<T, bool>> 
      (Expression.Not(invokedExpr), expr1.Parameters)); 
} 

var myAccounts= context.Accounts 
     .WhereNot(IsSomethingX); // does compile 

其實際上產生正確的SQL。

這是否看起來像一個很好的解決方案,有什麼我需要注意的,可能會導致我未來的問題?

回答

4

我使用WhereNot擴展方法編寫了一些測試代碼,它看起來不錯。 @ Stephan的解決方案也可以工作,但我會選擇擴展方法的可讀性。

+0

+1,所提出的解決方案很好,更易於使用。 – 2010-05-24 16:41:58

3
var compiled = IsSomethingX.Compile(); 
var myAccounts = context.Accounts.Where(x => !compiled(x)); 
+0

感謝您的選擇。 – cjk 2010-05-24 16:52:57