2011-09-13 72 views
1

我目前試圖解決的特定情況涉及到bool?引用數據庫中的可空字段。但邏輯應該適用於許多不同的情況。如何將where子句的部分委託給其他區域

我正在使用實體框架,並有一個布爾對象?屬性。我開始在這個特定的屬性上寫了很多Linq,但是因爲Sql在bool時沒有檢索空值? !=真寫,我發現我寫看起來像查詢:

var Result = from f in FooList 
      where f.NullableBool == false || f.NullableBool == null 
      where f.Bar.Contains(SearchTerm) 
      select f; 

這不是一個大問題,但我真的希望能夠刪除「x.NullableBool ==假|| x.NullableBool ==假」到不同的地方,而不是調用是這樣的:

var Result = from f in FooList 
      where f.IsNot && f.Bar.Contains(SearchTerm) 
      select f; 

我曾嘗試添加屬性和類型的方法,如‘表達< Func鍵<富,布爾>>’,「Func鍵< Foo,bool>'和'bool'到Foo類,但是Linq似乎並不喜歡它們。

任何指針非常讚賞。

感謝

回答

2

IQueryable擴展方法應該工作:

public static class QueryExtensions 
{ 
    public static IQueryable<Foo> WhereIsNot(this IQueryable<Foo> query) 
    { 
     return query.Where(f => 
      f.NullableBool == false || f.NullableBool == false); 
    } 
} 

然後你可以這樣使用它:

var result = from f in FooList.WhereIsNot() 
      where f.Bar.Contains(SearchTerm) 
      select f; 
+0

感謝Slauma,這將適用於這種情況。但是因爲這返回一個IQueryable(而不是ObjectQuery),所以我不能使用其他擴展名,如Include。 – Andy

+1

@Andy:在擴展方法調用之前,您必須指定'Include' *:來自FooList.Include(「Bars」)中的f。WhereIsNot()...'。當您使用普通的'Where'方法時,您還需要這樣做,因爲'Where'只返回'IQueryable'。 – Slauma

+1

你總是可以將'IQueryable'轉換回'ObjectQuery',或者你可以安裝EF 4.1,並使用'IQueryable'上的'Include'版本(並在內部進行轉換)。 –

0

我想你可以寫一個簡單的擴展方法

public static bool IsNot (this Foo f) 
{ 
    return f.NullableBool == false || f.NullableBool == false; 
} 

,並使用它像這樣

var Result = from f in FooList 
     where f.IsNot() && f.Bar.Contains(SearchTerm) 
     select f; 
+0

我不確定EF LINQ提供程序會知道如何處理'IsNot()'。 – dlev

+0

這實際上是我嘗試的第一件事,我也嘗試添加與非擴展靜態方法,普通方法和屬性相同的內容,並且每次都得到類似的結果:「LINQ to Entities無法識別方法'布爾IsNot(FooNamespace.Foo)'方法,並且此方法不能被轉換爲商店表達式。「 – Andy

相關問題