Не зная, какой поставщик LINQ вы используете (например, используемый по умолчанию LINQ To SQL или объектный реляционный маппер, такой как Mindscape Lightspeed или NHibernate ) или информацию о схеме базы данных, это сложнодать любой совет.
Поэтому, пока это не станет известно, лучшее, что я могу сделать, - это перестроить операторы LINQ, чтобы дать выбранному провайдеру больше знаний / контекста, чтобы он мог лучше оптимизировать запрос и, таким образом, возможно уменьшить количество вызовов базы данных.,
Примечание: Вы можете обнаружить, что невозможно сократить это до одного вызова базы данных.
Вот как бы я написал подобный запрос.
public IEnumerable<Speaker> GetSpeakers()
{
var speakers = db.Speakers;
var lastWeek = DateTime.Now.Date.AddDays(-7);
var recentVideos = db.Videos.Where(x => (x.DatePosted.Date >= lastWeek)).ToArray();
foreach (var speaker in speakers)
speaker.HasNew = recentVideos.Any(x => (x.Speaker == speaker));
return speakers.OrderBy(x => x.DisplayName);
}
- Получите неупорядоченные колонки, так как выполняйте заказ как можно позже.Если заказ предназначен для презентации, сделайте это позже в представлении.
- Сохраните дату 1024 * на прошлой неделе.Я использую
DateTime.Now.Date
и x.DataPosted.Date
, чтобы мы не сравнивали время, т.е. вы хотите найти все видео с прошлой недели, даже если вы выполняете поиск в 23:59. - Найти все последние видеокак массив, чтобы мы не перечисляли коллекцию несколько раз в следующей части.
- Переберите все динамики и проверьте, есть ли на этом динамике последние видео.
- Затем, если необходимо, упорядочите динамики по отображаемому имени.
Надеюсь, это поможет.Любые вопросы, пожалуйста, задавайте.