Невозможно создать постоянное значение типа 'Тип закрытия' с помощью .Any - PullRequest
1 голос
/ 08 декабря 2011

Изучите этот момент: рассмотрим схему с таблицами 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).

1 Ответ

1 голос
/ 08 декабря 2011

Я не могу точно объяснить, почему второй код не работает. Но очевидно, что есть проблема с использованием Compile() в этом запросе LINQ to Entities. При тестировании кода у меня было не ваше исключение, а «Внутренняя ошибка поставщика данных .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) это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...