EF 相交语法

blg*_*boy 5 c# linq-to-entities entity-framework

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

public JsonResult SearchNodesByTags(string[] tags)
{
    var dbTags = _DbContext.Tags.Where(t => tags.Contains(t.DisplayName)).ToList();
    var nodes = _DbContext.Nodes.Where(n => n.Tags.Intersect(dbTags).Any());  
    // Error about intersection with non primitive

    return Json(nodes);
}
Run Code Online (Sandbox Code Playgroud)

Ger*_*old 8

您可以在一个语句中执行此操作:

var nodes = _DbContext.Nodes
            .Where(n => n.Tags.All(t => tags.Contains(t.DisplayName)));
Run Code Online (Sandbox Code Playgroud)

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