У меня есть класс Asset
, у которого есть список дочерних элементов Tag
:
public class Asset
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int AssetID { get; set; }
public virtual List<Tag> Tags { get; set; }
}
public class Tag
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
[Key]
public int TagID { get; set; }
public virtual Asset Asset { get; set; }
}
Когда я выполняю запрос для извлечения всех активов вместе с их тегами, например:
public class GetAssetsQuery
{
readonly IDataContext dataContext;
public GetAssetsQuery(IDataContext dataContext)
{
this.dataContext = dataContext;
}
public async Task<List<Asset>> Execute(User user)
{
var allAssets = await dataContext.Assets
.Include(x => x.Tags)
.ToListAsync();
return allAssets;
}
}
И у меня есть другой запрос, чтобы получить все теги, используя SelectMany
:
public class GetTagsQuery
{
readonly GetAssetsQuery getAssetsQuery;
public GetTagsQuery(GetAssetsQuery getAssetsQuery)
{
this.getAssetsQuery = getAssetsQuery;
}
public async Task<IEnumerable<Tag>> Execute(User user)
{
var allAssets = await getAssetsQuery.Execute(user);
var tags = allAssets.SelectMany(x => x.Tags).ToList();
return tags;
}
}
Приведенный выше запрос снова возвращается в базу данных для каждого ресурса, чтобы получить теги.Разве .Include()
не было достаточно для получения всех тегов для ресурсов, чтобы он не выполнял дальнейшие запросы?