如何計算相關實體而不在實體框架中獲取它們

count entity-framework

我一直想知道這個問題,所以我認為使用我的第一個Stack Overflow帖子來詢問它是值得的。

想像一下,我與相關的消息列表進行了討論:

DiscussionCategory discussionCategory = _repository.GetDiscussionCategory(id);

discussionCategory.Discussions是當前未加載的Discussion實體列表。

我想要的是能夠遍歷discussionCategory中的討論並說明每次討論中有多少消息而不提取消息數據。

當我嘗試這個之前,我必須加載討論和消息,以便我可以做這樣的事情:

discussionCategory.Discussions.Attach(Model.Discussions.CreateSourceQuery().Include("Messages").AsEnumerable());

foreach(Discussion discussion in discussionCategory.Discussions)
{

int messageCount = discussion.Messages.Count;

Console.WriteLine(messageCount);

}

這對我來說似乎相當低效,因為我從數據庫中取出可能有數百個消息體並將它們保存在內存中,而我想做的就是將它們的數量用於表示目的。

我已經看到了一些涉及這個問題的問題,但他們似乎沒有直接解決它。

提前感謝您對此主題的任何想法。

更新 - 根據要求提供更多代碼:

public ActionResult Details(int id)
    {  
        Project project = _repository.GetProject(id);
        return View(project);
    }

然後在視圖中(只是為了測試它):

Model.Discussions.Load();
var items = from d in Model.Discussions select new { Id = d.Id, Name = d.Name, MessageCount = d.Messages.Count() };

foreach (var item in items) {
//etc

我希望這會讓我的問題更加清晰。如果您需要更多代碼詳細信息,請與我們聯繫。

一般承認的答案

簡單;只需投射到POCO(或匿名)類型:

var q = from d in Model.Discussions
        select new DiscussionPresentation
        {
            Subject = d.Subject,
            MessageCount = d.Messages.Count(),
        };

查看生成的SQL時,您會看到Count()由DB服務器完成。

請注意,這適用於EF 1和EF 4。


熱門答案

如果您使用的是Entity Framework 4.1或更高版本,則可以使用:

var discussion = _repository.GetDiscussionCategory(id);

// Count how many messages the discussion has 
var messageCount = context.Entry(discussion)
                      .Collection(d => d.Messages)
                      .Query()
                      .Count();

來源: http//msdn.microsoft.com/en-US/data/jj574232



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因