【问题标题】:Linq query with Include to count joined records带有 Include 的 Linq 查询以计算加入的记录
【发布时间】:2013-06-06 16:39:12
【问题描述】:

我正在使用 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() }

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

谢谢!

【问题讨论】:

    标签: c# linq entity-framework-4


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 - 但 p.s.w.g.只是快了一根头发。
    【解决方案2】:

    您的查询很好。唯一的问题是您需要为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&lt;DateTime&gt;,如下所示:

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

    【讨论】:

    • 谢谢,计数有效!但是 ev.StartDate.Date 不起作用:“LINQ to Entities 不支持指定的类型成员 'Date'”。也许我可以在网格的 ItemTemplate 中清理它。
    • @Jazzy 我没有意识到它不受支持。请参阅我的更新答案以获取另一种解决方案。
    • 智能对于所有这些选项都很好,但是当我运行页面时: System.ObjectDisposedException: ObjectContext 实例已被释放,不能再用于需要连接的操作。
    • 已解决---我将 DataFormatString="{0:dd/MM/yyyy}" 放在网格的 BoundField 中。感谢您的帮助。
    • @Jazzy 嗯,这很奇怪。大多数情况下发生的其他事情与您的查询无关。不过,很高兴你把它修好了。编码愉快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多