相当复杂的LINQ to Entities查询

时间:2011-05-24 08:47:10

标签: entity-framework entity-framework-4 linq-to-entities entity-framework-4.1

我有两个实体,假设它们被称为容器和记录。他们有一个主孩子关系:一个'容器'可以容纳许多记录。

数据库中的Records表包含以下列:

  • 编号
  • 日期
  • CONTAINER_ID
  • RecordType_Id

Record实体没有任何反向引用Container的导航属性。

我正在为我的存储库编写LINQ查询,该查询将仅检索每个RecordType_Id具有最新日期的容器的记录。应忽略所有旧记录。

因此,如果一个容器有5条记录,每条RecordType_Id一条,日期为2011年5月24日。但是每个RecordType_Id还有另外5条记录,但日期为20 / May / 2011。然后只检索带有24 / May日期的前5个并将其添加到容器中的集合中。

我提出了一个SQL查询来完成我需要的工作(但也许有一些更有效的方法?):

select t.*
from Records t
    inner join (
        select Container_Id, RecordType_Id, max(Date) AS MaxDate
        from Records
        group by Container_Id, RecordType_Id ) g
    on t.Date = g.MaxDate
        and t.Container_Id = g.Container_Id
        and t.RecordType_Id = g.RecordType_Id 
order by t.Container_Id 
    , t.RecordType_Id 
    , t.Date

然而,我正在努力将其转换为适当的LINQ查询。 EF已经生成一个相当大的查询,只是为了加载实体,这使我不确定这个SQL查询有多少实际上与LINQ查询相关。

2 个答案:

答案 0 :(得分:1)

脱离我的头顶:

var q = from c in Container
        from r in c.Records
        group r by r.RecordType.RecordType_Id into g
        select new
        {
            Container = c,
            RecordType_Id = g.Key,
            Records = from gr in g
                      let maxDate = g.Max(d => d.Date)
                      where gr.Date == maxDate
                      select gr
        };

答案 1 :(得分:1)

尝试使用LinqPad,它可以帮助您轻松测试linq查询。甚至针对现有的EF模型(在您的项目中)。访问http://www.linqpad.net/