0

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

Name 和 PostedName 是字符串。

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

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

理想情况下,我希望在字符串时忽略where子句。

如何才能做到这一点?

没有ifs和elses和whatifs的理想简写。

谢谢!

4

3 回答 3

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是根据需要为其他过滤器字段动态添加更多子句。

于 2013-10-16T19:06:02.963 回答
0

大卫的回答是正确的,但如果你想要一个快捷方式,你可以创建一个扩展方法来简化使用 示例(未经我测试)

于 2013-10-16T19:10:07.060 回答
0

我会建议:

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

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

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

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

于 2013-10-16T19:18:23.913 回答