研究一下:考虑一个包含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)。
答案 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),它可以工作。