如何检查实体的子集合中的项目是否存在于具有LINQ to Entities的另一个集合中?

时间:2014-08-08 10:13:55

标签: c# linq entity-framework linq-to-entities intersect

我希望有人从这个问题中抓住了这个想法,但我不知道如何更好地总结它。

问题是我尝试在应用程序中进行简单搜索。我在StackOverflow中有问题和标签实体 - 在多对多关系中。

我将一组标记ID传递给我的过滤方法。它应该返回所有具有此标记的Question实体(带有此ID)。我是这样做的:

int[] tagIds = { 1, 2, 3};
var questions = myEntities.Questions
                    .ToList()
                    .Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray()).Any())
                    .ToList();

一切正常,但现在我添加了更多过滤器,更多方法使用此过滤器,所以我想得到一个DbQuery对象,而不是List。

我尝试删除.ToList()表达式,以获得适当的结果:

int[] tagIds = { 1, 2, 3};
var questions = myEntities.Questions
                    .Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray()).Any());

不幸的是,我得到一个例外,说明LINQ无法识别.ToArray()方法。谁能让我更好地了解如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

中甚至不需要ToArray()方法
.Where(q => tagIds.Intersect(q.Tags.Select(t => t.Id).ToArray())

因为Intersect只需要一个IEnumerable,Select已经返回,不一定是数组。