对于使用MVC的简单搜索页面,我有以下lambda:
名称和已发布名称是字符串。
Results.where(A => a.Name.Contains(PostedName))。ToList();
非常感谢PostedName有一个值(优秀的过滤器),但是当它为空时,我得到了bupkas(空列表)。
理想情况下,当为空字符串时,我会忽略 where 子句。
如何做到这一点?
没有ifs和elses以及whatifs的理想速记。
谢谢!
答案 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中有前导和/或尾随空白字符,则它们将被删除。