【问题标题】:Fairly complex LINQ to Entities query相当复杂的 LINQ to Entities 查询
【发布时间】:2011-05-24 08:47:09
【问题描述】:

我有两个实体,假设它们被称为容器和记录。它们具有主子关系:一个“容器”可以保存许多记录。

数据库中的Records表有以下列:

  • 身份证
  • 日期
  • Container_Id
  • RecordType_Id

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

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

因此,如果一个容器有 5 条记录,每个 RecordType_Id 一条,日期为 2011 年 5 月 24 日。但每个 RecordType_Id 也有另外 5 条记录,但日期为 2011 年 5 月 20 日。然后只会检索日期为 5 月 24 日的前 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 查询相关。

【问题讨论】:

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


    【解决方案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
            };
    

    【讨论】:

    • 第 6 行表示无法解析 c 符号。但是,我不确定以匿名类型结束是正确的解决方案。我需要 EF 正常返回其跟踪的 Container 对象。除了每个 Container 的“记录”集合被限制为仅包含每种类型的最新条目。
    • 也许我做错了。也许我应该在 Container 对象到来时公开它们。但是让 Records 集合延迟加载,以便消费者可以附加他们的延迟查询逻辑来执行“仅最近记录”的限制。
    • 您可以通过将其包含在分组中来解决未解析的符号。不要让匿名类型让你失望——Records 属性是一个实体列表,就像你问的那样。
    • 我想我的问题可能措辞不当。这是我的容器存储库。因此它需要返回完全初始化的 Container 对象。对于每个 Container 对象,必须将 Record 对象过滤为仅是最近的对象。
    • 您可以根据需要返回 Container 对象。但是,如果您要求“过滤”Container.Records,那么它们没有完全初始化,因为真正的容器有更多的记录。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      相关资源
      最近更新 更多