【问题标题】:Best way to handle where clause in Lambda在 Lambda 中处理 where 子句的最佳方法
【发布时间】:2013-10-16 18:59:06
【问题描述】:

对于使用 MVC 的简单搜索页面,我有以下 lambda:

Name 和 PostedName 是字符串。

Results.where(a=>a.Name.Contains(PostedName)).ToList();

非常感谢 PostedName 有一个值(优秀的过滤器),但是当它为空时,我得到 bupkas(空列表)。

我希望我的 where 子句在 empty 字符串时被忽略。

如何做到这一点?

理想的简写形式,没有 if、else 和 whatif。

谢谢!

【问题讨论】:

    标签: asp.net-mvc lambda


    【解决方案1】:

    您可以动态添加WHERE 子句。请记住,您只是用这些子句构建了一个表达式树,它实际上并没有执行,直到在这种情况下调用.ToList()。所以你可以这样做:

    var filteredResults = Results;
    if (!string.IsNullOrWhitespace(PostedName))
        filteredResults = filteredResults.Where(a => a.Contains(PostedName));
    filteredResults = filteredResults.ToList();
    

    根据类型,您可能需要为 filteredResults 显式声明一个类型才能编译。

    如果你想要一些更内联的东西,这可能会奏效:

    Results.Where(a => string.IsNullOrWhitespace(PostedName) || a.Contains(PostedName)).ToList();
    

    不过,我认为它的意图不太清楚。第一个示例的好处还在于可以按照相同的结构添加更多过滤器,基本上是根据需要为其他过滤器字段动态添加更多WHERE 子句。

    【讨论】:

    • 哇,David 嘴巴塞得满满当当!谢谢!
    • LINQ to Entities 无法识别方法 'Boolean IsNullOrWhiteSpace(System.String)' 方法,并且此方法无法转换为存储表达式。 @大卫
    • @Pinch:这很有趣,因为我真的不 :) 我将它作为一个选项包含在内,但为了可读性和阐明代码的意图,我真的更喜欢第一个选项。如果将条件提取到它自己的方法中,则内联的可以变得更具可读性,但这取决于您的 LINQ 正在评估的对象。
    • +1 表示 IsNullOrWhiteSpace 非常有效。不幸的是,它出现在 .NET >= 4.0
    • @Pinch: LINQ to Entities 无法翻译string.IsNullOrWhiteSpace()?那真不幸。可能是使用第一个版本的另一个原因:) 虽然我想你可以让第二个中的条件更加手动,像 a.Equals(string.Empty)a == null 之类的东西,让它变得更不清楚.. .
    【解决方案2】:

    大卫的回答是正确的,但是如果你想要一个快捷方式你可以创建一个扩展方法来简化使用example (untested by me)

    【讨论】:

      【解决方案3】:

      我建议:

      Results.Where(a => a.Name.Contains((PostedName ?? "").Trim())).ToList();
      

      "ThisIsAString".Contains("") 返回真。

      如果PostedName为null,则改为""。

      如果 PostedName 中有前导和/或尾随空白字符,则它们将被删除。

      【讨论】:

        猜你喜欢
        • 2019-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        • 2010-11-15
        • 1970-01-01
        相关资源
        最近更新 更多