EF相交语法

时间:2015-06-19 21:07:00

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

用户界面允许用户选择一个或多个标签。我想选择所有具有用户输入关联的标签的节点,只是一个标签。

cms.signals.urls_need_reloading

2 个答案:

答案 0 :(得分:2)

您可以在一个声明中执行此操作:

var nodes = _DbContext.Nodes
            .Where(n => n.Tags.All(t => tags.Contains(t.DisplayName)));

您的陈述不正确,因为dbTags是包含Tag个对象的本地列表。在LINQ-to-Entities表达式中使用此列表时,无法将这些对象转换为SQL变量。这只能用原始值来实现。

答案 1 :(得分:0)

var nodes = _DbContext.Nodes.Where(n => n.Tags.Intersect(dbTags).Any());

首先,您无法在Linq-to-Entities表达式中使用对象,因此您必须使用以下内容进行比较:

n.Tags.Select(t => t.DisplayName).Intersect(tags)

其次,Intersect会为您提供两个给定集合中的项目集,因此您最终会得到所有任何Node个标签,而不是所有所有标签的节点。

如果您想要Node中包含每个Tag的所有tags,您可能希望在子集上使用here的答案:

_DbContext.Nodes
    .Where(n => !tags.Except(n.Tags.Select(t => t.DisplayName)).Any()) 
    .Select(...
  • set1.Except(set2)包含set1中不属于set2
  • 的元素 如果!set1.Except(set2).Any() == true包含set2 的每个元素,则
  • set1