Linq可选参数
我有一个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。如果用户不选择任何东西,它们可能是空值。我如何将它们包含在查询中。
这是为什么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();
它取决于DataContext,但您可能需要将'query'定义为'IQueryable '而不是使用'var'。一些提供者将它作为实现'IQueryable '的类。你也可以在'Users'后加上'AsQueryable()'。 – Servy 2012-04-05 15:06:30
你也可以使用'query = query.Where(u => u.FirstName.Contains(model.FirstName));'在你的if语句中。取决于你的首选语法。 – 2012-04-05 15:08:34
@Servy我已经为此更新了。很好,赶上,谢谢! – Yuck 2012-04-05 15:10:54
如果查询不包括特定的领域,你不需要将它作为在所有的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);
可以有条件地窝谓词这种方式来确保你只有你真正需要的条件。
感谢帮助。 – desiguy 2012-04-05 18:11:22
此列表不明?像某种查询生成器? – Jodrell 2012-04-05 15:32:38
所以,'model'类有一些可能与'User'实体的属性相匹配的任意属性,或者,这种关系是否更强? – Jodrell 2012-04-05 15:37:09