Как выбрать значение в LINQ Query в зависимости от результата выражения? - PullRequest
0 голосов
/ 21 января 2020

Я использую EF6 и ищу решение для создания запроса, в котором следует выбрать одно из полей, в зависимости от значения, которое возвращает Expression. Я играю с библиотекой LINQKit для этого, но получаю ошибку с этим.

Итак, я создал многократно используемый предикат, который вычисляет logi c в БД:

public partial class Study
{
    public static Expression<Func<Study, bool>> ShouldNameBeDisplayedForStaffExpression(int staffId)
    {
        return study =>
            (study.StudyViewAccessId == 1 && study.StudyEditAccessId == 1)
            || study.Roles.Any(y => y.StaffId == staffId);
        //Here other additional logic
    }
}

И теперь мне нужно установить правильное значение, чтобы поле Name зависело от результата, который возвращает предикат. Основное требование - это нужно делать на уровне запросов (в коллекции IQueryable). StudyCoreModelsQuery - это EF6 EntitySets.

IQueryable<Study> studiesCoreModelsQuery = this._dbContext.Studies;
IQueryable<StudyViewModel> query = studiesCoreModelsQuery.AsExpandable().Select(x => new StudyViewModel
{
    Name = Study.ShouldNameBeDisplayedForStaffExpression(staffId).Invoke(x)
        ? x.Name
        : "Hidden"
});

Невозможно понять, как получить результат выполнения выражения в Select. Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 22 января 2020

@ Иван Стоев, вы правы. Ваше предложение решило проблему. Рабочий код следующий:

IQueryable<Study> studiesCoreModelsQuery = this._dbContext.Studies;
var expression = Study.ShouldNameBeDisplayedForStaffExpression(staffId);
IQueryable<StudyViewModel> query = studiesCoreModelsQuery.AsExpandable().Select(x => new StudyViewModel
{
    Name = expression.Invoke(x)
        ? x.Name
        : "Hidden"
});
...