【问题标题】:Linq optional parametersLinq 可选参数
【发布时间】:2012-04-19 08:07:30
【问题描述】:

我有一个 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。如果用户没有选择任何东西,它们可能是空值。如何将它们包含在查询中。

【问题讨论】:

  • 此列表未知?像某种查询构建器?
  • 那么,model 类有一些任意属性可能与User 实体的属性相匹配,或者,这种关系是否更强?

标签: c# .net linq dynamic


【解决方案1】:

这是 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&lt;&gt; 而不是使用var。一些提供者将其作为实现IQueryable&lt;&gt; 的类。您也可以在Users 之后添加AsQueryable()
  • 您也可以在 if 语句中使用 query = query.Where(u =&gt; u.FirstName.Contains(model.FirstName));。取决于您喜欢的语法。
【解决方案2】:

如果查询不包含特定字段,则根本不需要将其作为 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);

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2017-05-06
    • 2016-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    相关资源
    最近更新 更多