Linq to Entities:此上下文仅支持原始类型或枚举类型

时间:2015-09-15 16:11:52

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

使用Linq to Entities我需要根据代表标准的复杂对象列表过滤我的实体集。例如:

var criteria = new[]
{
new { FirstName = "Bob", LastName = "Smith" },
new { FirstName = "Jane", LastName = "Doe" }
};

我尝试执行以下操作:

var filtered = PersonEntities.where(person => criteria.Any(c => c.FirstName == person.FirstName && c.LastName == person.LastName)).ToList();

由于查询构建器无法处理复杂对象,因此会导致错误。我知道如果我有一个要过滤的Id值,我可以简单地将它选择到内存列表中,并在linq查询条件中用它替换复杂对象。但是,当标准中需要多个字段时,我无法找到解决方案。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

正如评论中所建议的那样,在这种特定情况下,我们可以轻松解决问题,而无需手动构建复杂的表达式树。如果您的criteria应该是您声明的内容,您可以随时将其重新整形为包含由下划线分隔的名字和姓氏的字符串列表(这不应该是名称的任何有效字符)。然后你只有原始的集合/数组,并且可以在linq查询中完全使用它,如下所示:

var first_last = criteria.Select(e=> string.Format("{0}_{1}",e.FirstName,e.LastName));
var filtered = PersonEntities.Where(person => first_last.Any(e=>e == person.FirstName + "_" + person.LastName)).ToList();

如果构建表达式树,我想你甚至必须触摸所谓的ExpressionVisitor,这是一个相当长的代码(至少是我们已经完成的7-8倍)这里)。