我正在使用Linqpad连接到Entity Framework来形成我的Linq查询,它非常适合查看结果而无需运行您的应用程序。 无论如何,我有一个事件表,它连接到EventStudent表。 EventStudent表将为每个Event提供0到多条记录。我想回复一个活动日期和标题以及参加的学生人数。 EventStudent表包含学生以及布尔“参与”字段。
通过此查询,我获得了每个事件的所有事件数据和所有学生数据 - 这很好!
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() }
但是我得到一个错误“匿名类型成员声明符必须是简单名称......”。好的,但是,我怎样才能将我的事件数据和所有学生的数量都绑定到我的网格? 如果重要 - 网格有一个'select'列,这就是包含事件ID的原因 - 它将隐藏在网格中。此外,网格将具有排序和过滤功能。 并且......如何从Linq查询中仅返回日期(没有时间?)。
谢谢!
答案 0 :(得分:2)
试试这个。这将通过使用.Date属性从StartDate获取日期。它将Count()调用的结果命名为“StudentCount”。
select new { ev.EventID, ev.StartDate.Date, ev.Title, StudentCount = ev.EventStudents.Count() }
答案 1 :(得分:0)
你的查询很好。唯一的问题是您需要为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),