Очевидно, у вас есть таблица Items
, где каждый Item
имеет ноль или более Tags
.Кроме того, Items
имеет свойство Comments
, из которого мы не знаем, является ли это одной строкой или набором из нуля или более строк.Более того, каждый Item
имеет Title
.
. Теперь вам нужны все свойства Предметов, каждый со своим Comments
и списком уникальных Tags
предметов.Упорядочено по Title
Одна из более медленных частей запросов к базе данных - это передача выбранных данных из системы управления базами данных в локальный процесс.Следовательно, разумно ограничить объем данных до минимума, который вы действительно используете.
Кажется, что Tags
из Items
находятся в отдельной таблице.Каждый Item
имеет ноль или более Tags
, каждый Tag
принадлежит ровно одному предмету.Простое отношение один-ко-многим с внешним ключом Tag.ItemId
.
Если Item
с Id
300 имеет 1000 Tags
, то вы знаете, что каждый из этих 1000 Tags
имеетвнешний ключ ItemId
, который, как вы знаете, имеет значение 300. Какая трата, если вы перенесете все эти внешние ключи в локальный процесс.
Всякий раз, когда вы запрашиваете данные для проверкиSelect
только свойства, которые вы действительно планируете использовать.Используйте Include
только если вы планируете обновить включенный элемент.
Таким образом, ваш запрос будет:
var query = myDbContext.Items
.Where(item => ...) // only if you do not want all items
.OrderBy(item => item.Title) // if you Sort here and do not need the Title
// you don't have to Select it
.Select(item => new
{ // select only the properties you plan to use
Id = item.Id,
Title = item.Title,
Comments = item.Comments, // use this if there is only one item, otherwise
Comments = item.Comments // use this version if Item has zero or more Comments
.Where(comment => ...) // only if you do not want all comments
.Select(comment => new
{ // again, select only the Comments you plan to use
Id = comment.Id,
Text = comment.Text,
// no need for the foreign key, you already know the value:
// ItemId = comment.ItemId,
})
.ToList();
Tags = item.Tags.Select(tag => new
{ // Select only the properties you need
Id = tag.Id,
Type = tag.Type,
Text = tag.Text,
// No need for the foreign key, you already know the value
// ItemId = tag.ItemId,
})
.Distinct()
.ToList(),
});
var fetchedData = await query.ToListAsync();