У меня есть запрос с цепочкой 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"))
};
}