Lambda表达式使用OR运算符

8

我相信有更好的方法来写这段代码,但我现在脑袋一片空白。

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"

但编译器显示“运算符||不能应用于类型为'bool'和'string'的操作数”。非常感谢您的帮助。

1
追求可读性。我相信你目前的示例既易读又易于维护。这没有任何问题。请注意,如果在“using”和“return”语句之间没有任何内容,您可以直接使用“return db.Table.Where...” - default
谢谢大家的快速评论和回答。我没想到会有这么多的答案那么快地出现,哈哈,但我猜这就是为什么SO是第一的原因吧。@Default 谢谢你的提醒,我会记住的。再次感谢。 - Grizzly
@Servy 说得好,我漏掉了。为避免混淆已删除该评论。 - Jeroen Vannevel
4个回答

11

你可以使用数组/列表/哈希集的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包含许多元素,你应该使用具有O(1)复杂度的set HashSet

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

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

您可以在这里找到List-HashSet的性能比较。


在我看来,始终展示最好的例子。你不需要编辑到答案的末尾。 - default
2
出于好奇,HashSet会提高性能吗?这是针对数据库的查询,它会被转换为动态SQL,因此无论如何都需要遍历整个集合。 - Derek Van Cuyk
1
@Valentin Ok,我同意在内存中,通过哈希集进行搜索有时更有效。我想说的是,这个命令应该生成SQL(即,OP正在使用EF)。生成的查询应该是“SELECT ... WHERE FavoriteSport =“棒球”AND FavoriteColor IN(Red”,“Blue”,“Green”)”。它必须遍历整个集合以生成IN语句。 - Derek Van Cuyk
@DerekVanCuyk 是的,谢谢。我认为这两种情况都使用相同的 SQL 查询并具有相同的性能。 - Valentin

4
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;

3
您可以使用对象容器并使用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语句。

3

基本上大家都说了 - 你可以创建一个有效字符串的集合并查看你的字符串是否在该集合中。你可以内联完成:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接