繁体   English   中英

Linq查询(包括)对联接记录进行计数

[英]Linq query with Include to count joined records

我正在使用与Entity Framework的Linqpad连接来形成我的Linq查询,这非常适合查看结果而无需运行您的应用程序。无论如何,我有一个Event表,该表与EventStudent表相连。EventStudent表将具有每个事件0到许多记录。我想返回一个事件的日期和标题以及参加的学生人数。EventStudent表中有该学生以及一个布尔值“ attended”字段。

通过此查询,我可以获得每个事件的所有事件数据和所有学生数据-很好!

from ev in Events.Include("EventStudents")
where (ev.StartDate >= new DateTime(2012, 7, 1) && ev.StartDate <= new DateTime(2013, 6, 30))
orderby ev.StartDate descending
select ev

我想要的是活动信息和参加活动的COUNT个学生,因此我可以将其绑定到网格。 这是我尝试过的:

from ev in Events.Include("EventStudents")
where (ev.StartDate >= new DateTime(2012, 7, 1) && ev.StartDate <= new DateTime(2013, 6, 30))
orderby ev.StartDate descending
select new { ev.EventID, ev.StartDate, ev.Title, ev.EventStudents.Count() }

但是我收到一个错误消息“匿名类型成员声明符必须为简单名称...”。 好的,但是,如何将我的事件数据和学生人数全部以一种类型绑定到网格? 如果很重要-网格具有“选择”列,这就是为什么包含事件ID的原因-它将隐藏在网格中。 另外,网格将具有排序和过滤功能。 而且...如何从Linq查询返回仅具有日期的日期(没有时间?)。

谢谢!

尝试这个。 这是通过使用.Date属性从StartDate获取日期的。 并将Count()调用的结果命名为“ StudentCount”。

select new { ev.EventID, ev.StartDate.Date, ev.Title, StudentCount = ev.EventStudents.Count() }

您的查询很好。 唯一的问题是您需要为Count成员提供一个名称。 像这样:

from ev in Events.Include("EventStudents")
where (ev.StartDate >= new DateTime(2012, 7, 1) && ev.StartDate <= new DateTime(2013, 6, 30))
orderby ev.StartDate descending
select new 
{ 
    ev.EventID, 
    ev.StartDate, 
    ev.Title, 
    Count = ev.EventStudents.Count() 
}

MSDN

如果未在匿名类型中指定成员名称,则编译器将为匿名类型成员提供与用于初始化它们的属性相同的名称。 您必须为使用表达式初始化的属性提供名称...

您还提到您只想获取日期部分。 您可以使用TruncateTime函数,如下所示:

from ev in Events.Include("EventStudents")
where (ev.StartDate >= new DateTime(2012, 7, 1) && ev.StartDate <= new DateTime(2013, 6, 30))
orderby ev.StartDate descending
select new 
{ 
    ev.EventID, 
    StartDate = EntityFunctions.TruncateTime(ev.StartDate.Date), 
    ev.Title, 
    Count = ev.EventStudents.Count() 
}

请注意,您可能必须首先将此函数的输入转换为Nullable<DateTime> ,如下所示:

    StartDate = EntityFunctions.TruncateTime((DateTime?)ev.StartDate.Date), 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM