Asp.net mvc 处理Lambda中where子句的最佳方法

Asp.net mvc 处理Lambda中where子句的最佳方法,asp.net-mvc,lambda,Asp.net Mvc,Lambda,对于使用MVC的简单搜索页面,我有以下lambda: Name和PostedName是字符串。 Results.where(a=>a.Name.Contains(PostedName)).ToList() 非常感谢PostedName有一个值(优秀的过滤器),但是当它为空时,我得到了bupkas(空列表) 理想情况下,当字符串为空时,我希望忽略where子句 如何做到这一点 一种理想的没有“如果”、“其他”和“什么”的速记方式 谢谢 您可以动态添加WHERE子句。请记住,您只是用这些子句构建一个

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

Name和PostedName是字符串。

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

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

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

如何做到这一点

一种理想的没有“如果”、“其他”和“什么”的速记方式


谢谢

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

您可以动态添加
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的答案是正确的,但是如果您想要快捷方式,可以创建一个扩展方法来简化使用。

David的答案是正确的,但是如果你想要一个快捷方式,你可以创建一个扩展方法来简化使用。

我建议:

Results.Where(a => a.Name.Contains((PostedName ?? "").Trim())).ToList();
“thisisString.”包含(“”)
返回true

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

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

我建议:

Results.Where(a => a.Name.Contains((PostedName ?? "").Trim())).ToList();
“thisisString.”包含(“”)
返回true

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


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

哇,大卫,真是满嘴废话!谢谢LINQ to Entities无法识别方法“Boolean IsNullOrWhiteSpace(System.String)”方法,并且无法将此方法转换为存储表达式@David@Pinch:这很有趣,因为我真的不:)我把它作为一个选项,但为了可读性和澄清代码的意图,我真的更喜欢第一个选项。如果将条件提取到其自己的方法中,则内联方法可以变得更具可读性,但这取决于LINQ的计算结果。IsNullOrWhiteSpace的+1非常有效。不幸的是,它出现在.NET>=4中。0@Pinch:LINQ to Entities无法转换
字符串。IsNullOrWhiteSpace()
?那是。。。不幸。可能是使用第一个版本的另一个原因:)虽然我想你可以在第二个版本中稍微手动一些,使用
a.Equals(string.Empty)
a==null
之类的东西,使它更不清晰……哇,大卫,真是满嘴东西!谢谢LINQ to Entities无法识别方法“Boolean IsNullOrWhiteSpace(System.String)”方法,并且无法将此方法转换为存储表达式@David@Pinch:这很有趣,因为我真的不:)我把它作为一个选项,但为了可读性和澄清代码的意图,我真的更喜欢第一个选项。如果将条件提取到其自己的方法中,则内联方法可以变得更具可读性,但这取决于LINQ的计算结果。IsNullOrWhiteSpace的+1非常有效。不幸的是,它出现在.NET>=4中。0@Pinch:LINQ to Entities无法转换
字符串。IsNullOrWhiteSpace()
?那是。。。不幸。可能是使用第一个版本的另一个原因:)虽然我想您可以在第二个版本中稍微手动一些,使用
a.Equals(string.Empty)
a==null
之类的东西,使它更不清晰。。。