1

我正在使用 Linqpad 连接到 Entity Framework 来形成我的 Linq 查询,它非常适合在无需运行应用程序的情况下查看结果。无论如何,我有一个事件表,它连接到一个 EventStudent 表。EventStudent 表将有每个事件的 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() }

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

谢谢!

4

2 回答 2

2

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

select new { ev.EventID, ev.StartDate.Date, ev.Title, StudentCount = ev.EventStudents.Count() }
于 2013-06-06T16:46:09.207 回答
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), 
于 2013-06-06T16:46:29.733 回答