【问题标题】:Lambda Expression using OR operator使用 OR 运算符的 Lambda 表达式
【发布时间】:2016-06-14 10:18:05
【问题描述】:

我相信有更好的方法来写这个,但我遇到了心理障碍。

int num = 0;

using(var db = new TestDB())
{
    num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&
                             (x.FavoriteColor == "Green" || 
                              x.FavoriteColor == "Blue" || 
                              x.FavoriteColor == "Red")).Count();
}

return num;

有没有更好的方法来编写OR 语句?我试过了:

x.FavoriteColor == "Green" || "Blue" || "Red"

但是编译器说Operator || cannot be applied to operands of type 'bool' and 'string'

感谢任何帮助。

【问题讨论】:

  • 追求可读性。我相信您当前的示例既可读又可维护。这没什么错。请注意如果usingreturn 语句之间没有任何内容,您可以执行return db.Table.Where...
  • 感谢大家的快速cmets和答案。我没想到所有这些答案都会如此迅速地发生哈哈,但我想这就是为什么 SO 是 #1 的原因。 @Default 感谢您的注意。我一定会使用它。再次感谢
  • @Servy 好点,我错过了。删除评论以避免混淆

标签: c# lambda


【解决方案1】:

你可以使用数组/列表/哈希集的Contains方法。

var colors = new List<string> {"Green", "Red", "Blue" };

db.Table.Where(x => x.FavoriteSport == "Baseball" &&
                         (colors.Contains (x.FavoriteColor)).Count()

它会生成类似的 SQL 查询

SELECT ... WHERE FavoriteColor = 'Baseball' AND FavoriteColor in ("Green", "Red", "Blue")

我想补充一点,如果您使用存储在内存中的数据集,您应该记住 List 的 Contains 需要 O(N) 次迭代才能获得结果。所以如果colors 包含很多元素,你应该使用 set HashSet 而不是 O(1)。

var colors = new HashSet<string> {"Green", "Red", "Blue", .... };

someDataSet.Where(x => x.FavoriteSport == "Baseball" &&
                         (colors.Contains (x.FavoriteColor)).Count()

可以找到List-HashSet性能对比here

【讨论】:

  • 总是先展示最好的例子 IMO。您无需编辑到答案的末尾。
  • 出于好奇,hashset 会有性能提升吗?这是对数据库的查询,它被转换为动态 SQL,因此无论如何它都应该遍历整个集合。
  • @Valentin 好的,我同意在内存中,通过哈希集进行搜索更有效(有时)。我要说的是这个命令应该生成 SQL(即 OP 正在使用 EF)。生成的查询应该是 "SELECT ... WHERE FavoriteSport = "Baseball" AND FavoriteColor IN (Red", "Blue", "Green")。它必须遍历整个集合才能生成 IN 语句。
  • @DerekVanCuyk 是的,谢谢。因为我认为这两种情况都构建了具有相同性能的相同 sql 查询。
【解决方案2】:

几乎每个人都说过-您可以制作一个有效字符串的集合,然后查看您的字符串是否在该集合中。你可以内联:

num = db.Table.Count(x => x.FavoriteSport == "Baseball" &&
                       new []{"Green","Red","Blue"}.Contains(x.FavoriteColor);

值得注意的是,您可以直接将Where 换成Count

【讨论】:

    【解决方案3】:
    string[] FavColor = new string[]{"Green","Red","Blue"};
    
    int num = 0;
    
        using(var db = new TestDB())
        {
            num = db.Table.Where(x => x.FavoriteSport == "Baseball" &&FavColor.Any(x.FavoriteSport)).Count();
        }
    
        return num;
    

    【讨论】:

      【解决方案4】:

      您可以使用对象容器并使用 Contains 方法。例如:

      var favoriteColors = new List<string>
      {
         "Blue", "Green", "Red"
      };
      var num = 0;
      
      using(var db = new TestDB())
      {
        num = db.Table.Where(x => x.FavoriteSport == "Baseball" && favoriteColors.Contains(x.FavoriteColor)).Count();
      }
      

      我会检查配置文件以确保生成的 SQL 使用的是 IN 语句。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 2011-01-03
        • 1970-01-01
        • 2014-10-25
        • 2012-10-30
        • 1970-01-01
        • 2013-01-16
        相关资源
        最近更新 更多