2012-04-05 85 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