【问题标题】:IQueryable.Where clause AND not working with multiple search parametersIQueryable.Where 子句 AND 不使用多个搜索参数
【发布时间】:2012-01-04 03:28:35
【问题描述】:

我在使用 AND 运算符使用 IQueryable.Where 子句进行多重搜索时遇到问题。我知道问题是当一个参数为空或空时,它正在使用另一个参数搜索“”而不返回结果,但我不想通过扩展且可笑的嵌套 if 来检查空值或8 个参数的空白。我已经用谷歌搜索了好几天,OR 显然有效,但 AND 条件没有返回任何内容。

albums = albums.Where(a => a.CA_AlbumName.ToUpper().Contains(searchName.ToUpper()) && 
                           a.CA_AlbumURL.ToUpper().Contains(searchURL.ToUpper()));

如果两个参数都不为空,则上述方法有效,但如果其中一个参数为空,则不返回任何内容。我已经尝试根据以下非 null 但相同的结果构建 where:

if (!String.IsNullOrEmpty(searchName))
{
    albums = albums.Where(a => a.CA_AlbumName.ToUpper().Contains(searchName.ToUpper()));
}
if (!String.IsNullOrEmpty(searchURL))
{
    albums = albums.Where(a => a.CA_AlbumURL.ToUpper().Contains(searchURL.ToUpper()));
}    

【问题讨论】:

    标签: asp.net-mvc search where-clause iqueryable


    【解决方案1】:

    如果我正确理解您的要求,则以下一项应该可以工作: 罢工>

      albums = albums.Where(a => 
          (
              string.IsNullOrEmpty(searchName) || 
              a.CA_AlbumName.ToUpper().Contains(searchName.ToUpper())
          ) && 
          (
              string.IsNullOrEmpty(searchURL) || 
              a.CA_AlbumURL.ToUpper().Contains(searchURL.ToUpper())
          )
      );
    

    @James 是对的。更新的代码在这里:

      var isSearchNameNullOrEmpty = string.IsNullOrEmpty(searchName);
      var isSearchURLNullOrEmpty = string.IsNullOrEmpty(searchURL);    
    
      albums = albums.Where(a => 
          (
              isSearchNameNullOrEmpty || 
              a.CA_AlbumName.ToUpper().Contains(searchName.ToUpper())
          ) && 
          (
              isSearchURLNullOrEmpty || 
              a.CA_AlbumURL.ToUpper().Contains(searchURL.ToUpper())
          )
      );
    

    【讨论】:

    • +1 我可能会将字符串的结果存储起来。IsNullOrEmpty() 检查某处,因此不会每次都对其进行评估,但这应该可以。
    • 哈!我只是想发布它,以防有人决定将“神奇解决方案”剪切并粘贴到他们的项目中。不错的答案和更新。
    • 哇,非常感谢...一切顺利。你们这么快就做出了贡献,救了我的命,真是太棒了!
    • @user1060406 如果它对您有用,请务必选择此作为答案。
    猜你喜欢
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 2021-08-22
    • 2013-03-16
    • 2013-03-22
    • 2012-09-09
    • 1970-01-01
    相关资源
    最近更新 更多