如何计算相关实体而不在实体框架中获取它们

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



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因