Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在一个Where()子句LINQ中有多个Any()_C#_Linq - Fatal编程技术网

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等上正常工作