如何选择匹配列表中所有ID的所有对象?

时间:2013-06-24 21:43:47

标签: c# linq

我有一系列成分ID,我需要找到所有含有所有成分的配方,而不是一种或任何成分。

我试过这样的事情:

var query = (from ri in db.RecipesIngredients
                     where SelectedIDs.Contains(ri.IngredientId)
                     select ri.RecipeId).Distinct();

这充当:获取包含id1或id2或id3等的食谱。我希望它是:获取包含id1和id2以及id3等的食谱。

这可能吗?

2 个答案:

答案 0 :(得分:4)

你很亲密:

var query = (from r in db.Recipes
                     where SelectedIDs.All(i => r.Ingredients.Any(ri => ri.IngredientId == i))
                     select r.RecipeId).Distinct();

翻译为

“给我所有的食谱,SelectedIDs中的所有成分都在食谱的成分列表中。”

答案 1 :(得分:3)

怀疑您实际上想要所有不包含任何未选择成分的食谱,在这种情况下您可能会使用:

var query = db.RecipesIngredients
              .Except(db.RecipeIngredients
                        .Where(x => SelectedIDs.Contains(x.IngredientId)))
              .Select(ri => ri.RecipeId);

我相信这会使逻辑有意义 - 无论它是否转换为SQL都是另一回事。

如果你真的想要一份包含所有选定成分的配方(但也可能包括其他未经选择的成分),那么D Stanley的回答可能就是你所追求的。