处理Lambda中where子句的最佳方法

时间:2013-10-16 18:59:07

标签: asp.net-mvc lambda

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

名称和已发布名称是字符串。

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

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

理想情况下,当为空字符串时,我会忽略 where 子句。

如何做到这一点?

没有ifs和elses以及whatifs的理想速记。

谢谢!

3 个答案:

答案 0 :(得分:4)

您可以动态添加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子句。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我建议:

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

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

如果PostedName为null,则会更改为“”。

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