2016-03-01 147 views
5

我相信有更好的方法来写这个,但我正在经历一个心理障碍。使用OR运算符的Lambda表达式

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'

任何帮助表示赞赏。

+1

转到以提高可读性。我相信你现在的例子是可读和可维护的。这没什么错。请注意,'using'和'return'语句之间没有任何东西,你可以'return db.Table.Where ...' – Default

+0

谢谢大家的快速评论和回答。我没想到所有这些答案都会如此迅速地发生,但我想这就是为什么这是第一。 @默认谢谢你的提示。我一定会使用它。再次感谢 –

+0

@Servy好点,我错过了。删除评论以避免混淆 –

回答

6

您可以使用array/list/hashset的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") 

我想补充一点,如果你与存储在存储器中的数据集工作,你应该记住,李斯特Contains需要O承担(N )迭代来获得结果。所以如果colors包含很多元素,您应该使用集HashSet而不是O(1)。

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

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

你可以找到名单,HashSet的性能比较here

+0

始终首先显示IMO的最佳示例。你不需要编辑到答案的最后。 – Default

+2

出于好奇,哈希集会有一个性能提升?这是对数据库的查询,该数据库已转换为动态SQL,因此无论如何它都应该遍历整个集合。 –

+1

@Valentin好吧,我同意在内存中,通过哈希集搜索更有效(有时)。我要说的是,这个命令应该生成SQL(即OP使用EF)。生成的查询应该是“SELECT ... WHERE FavoriteSport =”Baseball“AND FavoriteColor IN( 红色,”蓝色“,”绿色“)。它将不得不遍历整个集合来生成IN语句。 –

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

您可以使用对象的容器,使用包含方法。例如:

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使用了teh IN语句。

3

几乎每个人都说过 - 你可以创建一个有效的字符串集合,看看你的字符串是否在该集合中。你可以在线做到这一点:

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

值得关注的是,你可以换你Where出来Count直接