Я экспериментирую с DDD и EF 4.1 Code First.
У меня есть Aggregate Root BlogEntry, который выглядит примерно так:
public class BlogEntry
{
public long Id { get; set; }
public string Title { get; set;}
public string Content { get; set; }
public DateTime Created { get; set; }
public virtual ICollection<BlogEntryComment> Comments { get; set; }
}
Теперь я хочу отобразить название последних 10 записей блога и количество комментариев к этим записям блога на веб-портале.
В настоящее время это реализовано так:
foreach(BlogEntry be in blogEntryRepository.GetLatestBlogEntries())
{
string title = be.Title;
int amountOfComments = be.Comments.Count();
// display title, amountOfComments, ...
}
К сожалению, Entity Framework выполняет здесь один запрос для получения объектов BlogEntry, а затем выполняет один запрос для каждого BlogEntry для получения количества комментариев.
-> EF сгенерированный SQL похож на это:
select top 10 * from BlogEntry order by Created desc
, а затем 10 раз:
select count(*) from BlogEntryComment where BlogEntry = @blogEntryId
Как я могу таким образом предотвратить это поведение, не стремясь загрузить все Комментарии, но при этом не снимая запрос для каждого BlogEntry по базе данных - но не вступая в конфликт с какими-либо правилами DDD?
(то, что я хотел бы, чтобы EF запускал базу данных, было примерно так:)
select top 10
be.*,
(select count(*) from BlogEntryComment c where c.BlogEntryId = be.Id) as AmountOfComments
from BlogEntry be order by be.Created DESC
Спасибо.