无法使用.Any创建“闭包类型”类型的常量值

时间:2011-12-08 17:43:56

标签: entity-framework linq-to-entities

研究一下:考虑一个包含Person,GovernmentId和GovernmentIdType表的模式。 Andrew Tappert(Person)有两张身份证(GovernmentId),一张来自Oregon(GovernmentIdType),另一张来自华盛顿(GovernmentIdType)。

现在从中生成一个edmx。

现在想象你想要找到所有具有特定ID值的人,比如说1234567。

这可以通过单个数据库命中来实现:

dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<Person,bool>> expr =
    person => person.GovernmentID.Any(gid => gid.gi_value.Contains(idValue));

IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);
List<Person> people = peopleQuery.ToList();

这很有效。现在为什么以下结果导致此闭包类型异常...

dbContext context = new dbContext();
string idValue = "1234567";
Expression<Func<GovernmentId, bool>> gidExpr = gid => gid.gi_value.Contains(idValue);
Expression<Func<Person,bool>> expr =
    person => person.GovernmentID.AsQueryable().Any(gidExpr);

IEnumerable<Person> peopleQuery = context.Person.AsQueryable().Where(expr);
List<Person> people = peopleQuery.ToList();

修改

使用的版本是EF 1(.NET 3.5)。

1 个答案:

答案 0 :(得分:1)

我无法解释为什么第二个代码不起作用。但显然在此LINQ to Entities查询中使用Compile()存在问题。在测试代​​码时,我没有您的异常,而是“内部.NET Framework数据提供程序错误1025”。

以下虽然对我有用(将AsQueryable应用于GovernmentID集合,以便您可以直接使用表达式而不使用Compile()):

dbContext context = new dbContext();
string idValue = "1234567";

Expression<Func<GovernmentId, bool>> gidExpr =
    gid => gid.gi_value.Contains(idValue);

Expression<Func<Person,bool>> expr =
    person => person.GovernmentID.AsQueryable().Any(gidExpr);

IEnumerable<Person> people = context.Person.AsQueryable().Where(expr);

最后一行中的AsQueryable()是多余的,可以移除,因为context.Person无论如何都是IQueryable<T>

修改

使用EF 1(.NET 3.5)重现错误。使用EF 4.0和EF 4.1(.NET 4),它可以工作。