C# 在一个Where()子句LINQ中有多个Any()
是否可以在一个C# 在一个Where()子句LINQ中有多个Any(),c#,linq,C#,Linq,是否可以在一个where()子句中使用多个Any() 例如,如果我需要获得喜爱的啤酒,此查询将完成以下工作: var favouriteDrinks = drinks .Where(f => favouriteBeers .Any(d => d.drinkID == f.drinkID)); 但是如果我需要买最喜欢的啤酒和葡萄酒呢?我在找这样的东西: var favouriteDrinks = drinks .Where(f => favourit
where()
子句中使用多个Any()
例如,如果我需要获得喜爱的啤酒,此查询将完成以下工作:
var favouriteDrinks = drinks
.Where(f => favouriteBeers
.Any(d => d.drinkID == f.drinkID));
但是如果我需要买最喜欢的啤酒和葡萄酒呢?我在找这样的东西:
var favouriteDrinks = drinks
.Where(f => favouriteBeers.Any(d => d.drinkID == f.drinkID) ||
f => favouriteWines.Any(d => drinkID == f.drinkID));
var favouriteDrinks = drinks.Where(f =>
favouriteBeers.Any(d => d.drinkID == f.drinkID)) ||
favouriteWines.Any(d => d.drinkID == f.drinkID)));
为什么不这样做:
var favouriteDrinks = drinks
.Where(f => favouriteBeers.Any(d => d.drinkID == f.drinkID) ||
f => favouriteWines.Any(d => drinkID == f.drinkID));
var favouriteDrinks = drinks.Where(f =>
favouriteBeers.Any(d => d.drinkID == f.drinkID)) ||
favouriteWines.Any(d => d.drinkID == f.drinkID)));
您还可以使用包含:
var favouriteDrinks = drinks.Where(f =>
favouriteBeers.Contains(f.drinkID) ||
favouriteWines.Contains(f.drinkID));
您可以使用.Union()
和.Join()
只要最爱的啤酒
,和最爱的葡萄酒
属于同一类型,这就行了。这修正了Tim.Tang的第二个例子,我相信。这里有几种方法,但如果归结为“包含”与“任何”,我更喜欢包含,因为我更清楚它的意图
var favouriteDrinks = drinks.Where(d =>
favouriteBeers.Select(b => b.drinkId).Contains(d.drinkID) ||
favouriteWines.Select(w => w.drinkId).Contains(d.drinkID));
类似地,通过在“饮料”类上实现正确的IEquatable接口,您也可以稍微简化
var favouriteDrinks = drinks.Where(d =>
favouriteBeers.Contains(d) || favouriteWines.Contains(d));
LINQ本身对此没有问题(一旦您使第二个可编译),但是LINQ to SQL或LINQ to Entities可能在将其转换为良好的SQL查询时遇到问题。确实有可能,您只需要定义您的用例。取决于您使用的是什么,LINQ to Entities或LINQ to Object,linq to entities不能接受非基元类型表达式,但使用多个any肯定是有效的,第二个代码f=>
是不必要的谢谢。我将尝试这两种方法。看起来第二个查询无效。@user3715778第二个查询应该可以在linq2sql/linq2ef/linq2object等上正常工作