实体框架4.0 - 返回模型对象列表+每个对象的子项数

时间:2011-02-13 13:17:10

标签: c# entity-framework-4 linq-to-entities

我在我的项目中遇到了一个常见的需求,即返回我的模型对象的集合,以及每个模型中某些类型的子项的计数,但我不知道是否可能或如何建模“TotalCount” “Model类中的属性,并将其作为单个Entity Framework查询的一部分填充,最好使用LINQ查询。是否可以这样做,同时能够使用实体框架.Include(“对象”)和.Skip()和.Take()?我是实体框架的新手,所以我可能会遗漏许多明显的东西,可以允许这个......

我希望能够对动态构造的计数属性进行分页。我认为最具扩展性的方法是将计数存储为单独的数据库属性,然后只查询计数属性。但是对于我正在处理的行数很少的情况,我宁愿动态地进行计数。

在这样的模型中:

表:类

表:教授

表:参加者

表:ClassComment

我想以List的形式返回Class对象的列表,但我还希望在单个查询(LINQ首选)中确定Attendees和Class注释的计数,并在两个Class属性中设置AttendeeCount和ClassCommentCount。

到目前为止我有这个:

var query = from u in context.Classes
            orderby tl.Name
            select u;

List<Class> topics = ((ObjectQuery<Class>)query)
    .Include("ClassComments")
    .Skip(startRecord).Take(recordsToReturn).ToList();

如果可能的话,为了产生单个数据库查询,我们非常感谢任何仍然允许使用.Include()和分页的建议或替代查询方法。谢谢你的任何建议!

2 个答案:

答案 0 :(得分:3)

试试这个:

public class ClassViewModel {
    public Class Class { get; set; }
    public int AttendeeCount { get; set; }
    public int ClassCommentCount { get; set; }
}


var viewModel = context.Classes.Select(clas => 
    new ClassViewModel { 
        Class = clas, 
        AttendeeCount = clas.ClassAttendes.Count, 
        ClassCommentCount = clas.ClassComments.Count}
).OrderBy(model => model.ClassCommentCount).Skip(startRecord).Take(recordsToReturn).ToList();

您不必包含评论以获得计数。

答案 1 :(得分:2)

它不会以这种方式工作。最简单的方法是将投影用于匿名(或自定义)非实体类型。我会尝试这样的事情:

var query = context.Classes
              .Include("ClassComments")  // Only add this if you want eager loading of all realted comments
              .OrderBy(c => c.Name)
              .Skip(startRecord)
              .Take(recordsToReturn)
              .Select(c => new 
                 {
                   Class = c,
                   AttendeeCount = c.Attendees.Count(),
                   ClassCommentCount = c.ClassComments.Count() // Not needed because you are loading all Class comments so you can call Count on loaded collection
                 });

您的要求中的问题是AttendeeCount和ClassCommentCount属性。您无法轻松地将它们添加到模型中,因为数据库中没有相应的列(除非您定义了一列,在这种情况下您不需要手动计算记录)。您可以在部分类实现中定义它们,但在这种情况下,您不能在Linq-to-entities查询中使用它们。

在EF中映射它的唯一方法是使用DB视图并创建特殊的只读实体以在应用程序中表示它或使用DefiningQuery这是在SSDL中定义的自定义SQL命令而不是DB表或视图