对于使用 MVC 的简单搜索页面,我有以下 lambda:
Name 和 PostedName 是字符串。
Results.where(a=>a.Name.Contains(PostedName)).ToList();
非常感谢 PostedName 有一个值(优秀的过滤器),但是当它为空时,我得到 bupkas(空列表)。
理想情况下,我希望在空字符串时忽略where子句。
如何才能做到这一点?
没有ifs和elses和whatifs的理想简写。
谢谢!
对于使用 MVC 的简单搜索页面,我有以下 lambda:
Name 和 PostedName 是字符串。
Results.where(a=>a.Name.Contains(PostedName)).ToList();
非常感谢 PostedName 有一个值(优秀的过滤器),但是当它为空时,我得到 bupkas(空列表)。
理想情况下,我希望在空字符串时忽略where子句。
如何才能做到这一点?
没有ifs和elses和whatifs的理想简写。
谢谢!
您可以动态添加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
是根据需要为其他过滤器字段动态添加更多子句。
大卫的回答是正确的,但如果你想要一个快捷方式,你可以创建一个扩展方法来简化使用 示例(未经我测试)。
我会建议:
Results.Where(a => a.Name.Contains((PostedName ?? "").Trim())).ToList();
"ThisIsAString".Contains("")
返回真。
如果 PostedName 为 null,则将其更改为“”。
如果 PostedName 中有前导和/或尾随空白字符,则它们将被删除。