我在我的项目中遇到了一个常见的需求,即返回我的模型对象的集合,以及每个模型中某些类型的子项的计数,但我不知道是否可能或如何建模“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()和分页的建议或替代查询方法。谢谢你的任何建议!
答案 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表或视图