2012-04-05 75 views
7

我有一個linq查詢。我從我收集的表單中選擇了一堆參數,我需要根據用戶正在搜索的字段進行過濾。Linq可選參數

IQueyable<Users> user = from user in edmxObject.Users 
where user.FirstName.Contains(model.FirstName ?? user.FirstName) 
&& user.UserName.Contains(model.UserName ?? user.UserName) 

我還有一些我需要過濾的非字符串字段過濾器,包括long和boolean。如果用戶不選擇任何東西,它們可能是空值。我如何將它們包含在查詢中。

+0

此列表不明?像某種查詢生成器? – Jodrell 2012-04-05 15:32:38

+0

所以,'model'類有一些可能與'User'實體的屬性相匹配的任意屬性,或者,這種關係是否更強? – Jodrell 2012-04-05 15:37:09

回答

16

這是爲什麼LINQ如此強大 - 延期執行的最好例子之一。你可以建立在不同階段的查詢,並且僅當最後執行或解決將SQL語句生成的查詢:

var query = edmxObject.Users.AsQueryable<Users>(); 

if (! String.IsNullOrEmpty(model.FirstName)) { 
    query = from user in query 
      where user.FirstName.Contains(model.FirstName) 
      select user; 
} 
if (! String.IsNullOrEmpty(model.UserName) { 
    query = from user in query 
      where user.UserName.Contains(model.UserName) 
      select user; 
} 

// this will cause the query to execute get the materialized results 
var result = query.ToList(); 
+3

它取決於DataContext,但您可能需要將'query'定義爲'IQueryable <>'而不是使用'var'。一些提供者將它作爲實現'IQueryable <>'的類。你也可以在'Users'後加上'AsQueryable()'。 – Servy 2012-04-05 15:06:30

+1

你也可以使用'query = query.Where(u => u.FirstName.Contains(model.FirstName));'在你的if語句中。取決於你的首選語法。 – 2012-04-05 15:08:34

+0

@Servy我已經爲此更新了。很好,趕上,謝謝! – Yuck 2012-04-05 15:10:54

5

如果查詢不包括特定的領域,你不需要將它作爲在所有的where子句的一部分:

IQueyable<Users> user = from user in edmxObject.Users; 

if (model.FirstName != null) 
    users = users.Where(user => user.FirstName.Contains(model.FirstName) 

if (/* age is searched for */) 
    users = users.Where(user => user.Age == model.Age); 

可以有條件地窩謂詞這種方式來確保你只有你真正需要的條件。

+0

感謝幫助。 – desiguy 2012-04-05 18:11:22