2011-09-15 130 views
6

我有一些表和下列條件的查詢:如果參數A爲空,如果沒有,請在查詢中使用它。我知道如何做到這一點在兩個步驟:Linq:如果參數爲空,如何排除條件

List<O> list = null; 
if (A = null) 
{ 
    list = context.Obj.Select(o => o).ToList(); 
} 
else 
{ 
    list = context.Obj.Where(o.A == A).ToList(); 
} 

是否有可能具有相同的一個查詢? 感謝

+2

我認爲你不需要'選擇()'那裏。 – svick

+0

我希望你的意思是'A == null'! (C#應該避免編譯,但最好確保所發佈的代碼是以適當的可編譯形式發佈的。重要的是要批註發佈的代碼,因爲*會在某些語言中編譯[但不能按預期工作]。) – 2011-09-15 23:17:30

回答

16

如何:

list = context.Obj.Where(o => A == null || o.A == A) 
        .ToList(); 

編輯:你能做到在一個查詢,但仍然使用條件:

IEnumerable<O> query = context.Obj; 
if (A != null) 
{ 
    query = query.Where(o => o.A == A); 
} 
var list = query.ToList(); 
+0

這種方式的條件'A == null'將被評估集合的每一個項目,雖然更可讀我不認爲它是完全正確的。 –

+1

@ AS-CII,不一定。這對於LINQ來說就是這種情況。但是這個查詢看起來像LINQ to SQL或類似的東西。 – svick

+0

讓我試試這個。謝謝。 – mimic

3

我可能會寫這樣的查詢:

IQueryable<O> query = context.Obj; 
if (A != null) 
    query = query.Where(o => o.A == A); 
var list = query.ToList() 

這不是一個表達式,但我認爲它很可讀。

此外,此代碼假定context.ObjIQueryable<O>(例如,您正在使用LINQ to SQL)。如果情況並非如此,請使用IEnumerable<O>

0

嘗試

context.Obj.Where(a => A != null && a.A == A).ToList() 

應該都是不錯的。如果A爲空,則'a.A == A'將被忽略。

2

我選擇了

var list = context.Obj.Where(o => A.HasValue ? o.a == A : true);