Предикат рефакторинга из лямбда-экспресса вызывает исключение - PullRequest
0 голосов
/ 22 июля 2011

У меня есть метод, который создает большое лямбда-выражение на основе входящих параметров (фильтр для запроса базы данных, Entity Framework v. 1.0).Допустим, у нас есть сущности Person, Department и Occation.Человек может иметь Профессии, и Профессия принадлежит Департаменту.

Вот код:

var query = myDbContext.AsQueryable();
query = query.Persons.Where(.......) //Building some conditions
...
... //Adding conditions to the query if there are incoming params

Проблема заключается в следующем фрагменте:

//We have a Department Id as parameter, so we want to filter persons whose Occupations belong to this Department
query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).Count(occ => occ.Department.Id == myFilterParameter) > 0;)

Этоработает нормально, но при рефакторинге предиката для команды Count () из выражения, например, так:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId == myFilterParameter;
query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).Count(countExpression.Compile()) > 0);

Это вызывает

Внутренняя ошибка поставщика данных .NET Framework 1025.

Есть идеи, почему так происходит?

Я пробовал также:

query = query.Where(per => per.Occupations.Where(occ => !occ.IsDeleted).AsQueryable().Count(countExpression.Compile()) > 0), the same picture.

Любая помощь будет очень заметной.

Ответы [ 2 ]

1 голос
/ 22 июля 2011

Опечатка:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId = myFilterParameter;

это должно быть:

Expression<Func<Occupation, bool>> countExpression = occ => occ.DepartmentId == myFilterParameter;

0 голосов
/ 22 июля 2011

Удалить Compile() в countExpression.Compile()

Редактировать - Вы пробовали что-то подобное?

query.Where(per => per.Occupations
                      .Where(occ => !occ.IsDeleted)
                      .Any(countExpression));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...