Одним из более медленных элементов диалога с базой данных является передача выбранных данных из системы управления базами данных в ваш процесс. Желательно не отправлять в ваш процесс больше данных, чем вы планируете использовать.
Очевидно, у вас есть последовательность Questions
, где каждый Question
имеет ноль или более QuestionOptions
, а каждый QuestionOption
принадлежит ровно одному Question
, а именно Question
с Id
, равным QuestionOption.QuestionId
. Простой один ко многим с внешним ключом в QuestionId
.
Если вы получите Question
с Id == 4 с десятью тысячами QuestionOptions
, вы знаете, что у каждого QuestionOption
будет QuestionId
со значением 4. Вы будете передавать значение 4 10 тысяч раз, хотя вы, вероятно, даже не будете его использовать, поскольку вы уже знаете, что он равен Question.Id
.
Решения: используйте «Включить», только если вы планируете обновить элемент базы данных.
Во всех остальных случаях используйте Select.
Выберите только те свойства, которые вы действительно планируете использовать.
В синтаксисе метода (или используйте аналогичный синтаксис запроса, если хотите)
var result = context.Questions.Join(context.QuestionOptions, // join Questions and QuestionOptions
question => question.Id, // from every Question take the Id
questionOption => questionOption.QuestionId, // from every Option take the QuestionId
(question, questionOption) => new // when they match make a new object
{ // Select only the properties you plan to use:
Question = new
{
Id = question.Id,
... other question properties
},
Option = new
{
Id = questionOption.Id,
// not needed: questionOption.QuestionId, it equals Question.Id
... other properties you plan to use
}
});
Делайте ToList
, только если вы действительно планируете использовать все извлеченные элементы. Сохраняйте свой результат в IQueryable как можно дольше.
Если у вас есть каждый Question with its QuestionOptions
, рассмотрите возможность использования Queryable.GroupBy
var questionsWithTheirOptions = context.Questions
.GroupJoin(context.QuestionOptions, // GroupJoin Questions and QuestionOptions
question => question.Id, // from every Question take the Id
questionOption => questionOption.QuestionId, // from every Option take the QuestionId
(question, optionsOfQuestion) => new // when they match make a new object
{ // desired Question Properties
Id = question.Id,
...
// The options of this question:
Options = optionsOfQuestion.Select(option => new
{
Id = questionOption.Id,
// not needed: questionOption.QuestionId, it equals Question.Id
...
})
.ToList()
});