Я использую EF6 и ищу решение для создания запроса, который должен выбирать одно из полей в зависимости от значения, возвращаемого Expression. Я играю с библиотекой LINQKit для этого, но с этим не получается.
Поэтому я создал повторно используемый предикат, который вычисляет логику в БД:
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). StudiesCoreModelsQuery — это наборы сущностей EF6.
IQueryable<Study> studiesCoreModelsQuery = this._dbContext.Studies;
IQueryable<StudyViewModel> query = studiesCoreModelsQuery.AsExpandable().Select(x => new StudyViewModel
{
Name = Study.ShouldNameBeDisplayedForStaffExpression(staffId).Invoke(x)
? x.Name
: "Hidden"
});
Не могу понять, как получить результат выполнения Expression в Select. Я буду признателен за любую помощь.
staffId
? Можете ли вы переместитьStudy.ShouldNameBeDisplayedForStaffExpression(staffId)
вызов за пределыSelect
? Потому что там, где он сейчас, он толком не называется. напримерvar showNameExpr = Study.ShouldNameBeDisplayedForStaffExpression(staffId);
и затем внутриSelect
сделатьName = showNameExpr.Invoke(x) ? x.Name : "Hidden"
- person Ivan Stoev   schedule 21.01.2020Invoke
внутри. - person Ivan Stoev   schedule 21.01.2020