Изучите этот момент: рассмотрим схему с таблицами Person, GovernmentId и GovernmentIdType.У Эндрю Тапперта (персона) есть две идентификационные карты (GovernmentId), одна из Орегона (GovernmentIdType) и одна из Вашингтона (GovernmentIdType).
Теперь создайте из него edmx.
Теперь представьте, что вы хотитечтобы найти всех людей, имеющих определенное значение идентификатора, скажем, 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).