Извлечение LINQ выберите выражение из - PullRequest
0 голосов
/ 12 марта 2020

У меня есть запрос с цепочкой LINQ, который выглядит следующим образом:

return incidents
    .Include(x => x.Submission)
    .ThenInclude(x => x.Answer)
    .Select(incident => new Incident
    {
        Id = incident.Id,
        Submission = incident.Submission.Select(submission => new Submission
        {
            Id = submission.Id,
            Answer = context.SubFields.ContainsKey("answer") ? submission.Answer : null
        }).ToList()

incidents имеет тип IQueryable<Incident>, и я пытаюсь выбрать определенные поля, поэтому запрос SQL, генерируемый при нажатии кнопки В базе данных не выбраны все свойства, некоторые из которых нам не нужны и которые делают запрос медленным. Тройное выражение определяет, действительно ли нам нужно это конкретное свойство, выбранное из БД (это происходит из запроса GraphQL, поэтому мы не знаем заранее). Этот код в настоящий момент работает и генерирует самый оптимальный запрос SQL.

Что я хочу сделать, это извлечь лямбда-выражение из метода выбора Submission в отдельный метод. Поскольку мы будем использовать Submission за пределами этого Incident запроса, я хочу извлечь его из метода, который я могу использовать повторно.

В идеальном мире я пытаюсь заставить свой код выглядеть как следующее, но я не знаю, как сделать генерацию выражения. Как мне это сделать?

Submission =  incident.Submission.Select(GENERATE_AN_EXPRESSION(context.SubFields["submission"])).ToList()
GENERATE_AN_EXPRESSION(Field field)
        {
            return submission => new ApplicationCore.Entities.Submission
            {
                Id = submission.Id,
                Answer = submission.Answer.SelectAnswer(field.SelectionSet.GetField("answer"))
            };
        }
...