我正在試驗DDD和EF 4.1 Code First。 我有一個聚合根BlogEntry看起來simlar這樣:DDD,EF,Aggregations
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, ...
}
可惜的是什麼實體框架在這裏所做的是執行一個查詢來獲取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
感謝。
我意識到這一點,但如何適應ddd環境。 不是應該返回實體的存儲庫 - 不是匿名類型? – bes
@bes:如果你的域對象上有一個非持久的'CommentCount'屬性,你可以讓你的存儲庫用類似Jayantha建議的查詢填充該屬性,並返回一個實體。 –
我已經添加了一些解決方法 –