Linq to Entities с пользовательским методом в Where - PullRequest
1 голос
/ 25 октября 2019

У меня сложный запрос LINQ to Entities, который слишком длинен. Я хочу разделить это на несколько хорошо названных методов, чтобы другие могли понять это. Этот пост, кажется, подразумевает, что я могу делать это, пока я возвращаю Expression EF, который можно перевести. https://stackoverflow.com/a/18338476/4812782

Вот мой упрощенный код. Я не могу получить данные до фильтрации, потому что это будет более 100 000 записей. Моя база данных - Oracle.

var q = _context.vehicles
    .Where(x => IsActiveVehicle())
    .ToList()

Expression<Func<tb_vehicle, bool>> IsActiveVehicle()
            {
                return vehicle => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false;
            }

Я получаю ошибку

Невозможно скрыть преобразование типа 'System.Linq.Expressions.Expression>' в 'bool'. Невозможно преобразовать лямбда-выражение в предназначенный тип делегата, поскольку некоторые из возвращаемых типов в блоке неявно не преобразуются в возвращаемый тип делегата

Любая помощь приветствуется.

1 Ответ

4 голосов
/ 25 октября 2019

Это неверно, как отмечается в ошибке:

.Where(x => IsActiveVehicle())

Это создает новое выражение, содержащее ваше выражение.

Вы хотите фактически передать Expression<Func<>> в.Where.

var q = _context.vehicles
    .Where(IsActiveVehicle())
    .ToList()

Обратите внимание на вопрос / ответ, который вы связали, и вы увидите его.


Другой способ взглянуть на него:

.Where(x => IsActiveVehicle())

Означает следующее бессмысленное:

.Where(x => ((vehicle) => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false))

Однако это:

.Where(IsActiveVehicle())

Означает следующее, что имеет больше смысла:

.Where(vehicle => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false)
...