Linq可选参数

我有一个linq查询。 我从我收集的表单中获取了一堆参数,我需要根据用户搜索的字段进行过滤。

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

我还需要一些非字符串字段filter,包括long和boolean。 如果用户没有选择任何内容,它们可能为空。 如何将它们包含在查询中。

这是LINQ如此强大的最佳示例之一 – 延迟执行。 您可以在不同阶段构建查询,并且只有在最终执行或解析查询时才会生成SQL语句:

 var query = edmxObject.Users.AsQueryable(); 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(); 

如果查询不包含特定字段,则根本不需要将其作为where子句的一部分包含在内:

 IQueyable 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); 

您可以通过这种方式有条件地嵌套谓词,以确保您只有您真正需要的条件。