【问题标题】:Entityset turns to IEnumerable at an early stageEntityset 早期转向 IEnumerable
【发布时间】:2011-07-08 19:42:12
【问题描述】:

我有以下问题:我想以简洁的概览显示来自帮助台系统的工单。我还想显示数据摘要,例如按优先级和类别分组。最重要的是,必须将相同的数据转换为 .pdf 文档。

我分几个步骤检索数据。第一步是原始数据,它是 .pdf、摘要和实际概述的基础。这样,我确保他们获取相同的数据。创建 .pdf 后,我直接从数据中读取。汇总是通过展平数据进行的。概览是通过从数据中获取一页 25 条记录并将字段放入网格中来创建的。

问题是

IQueryable<RelationHoursTicketItem> HoursByTicket = 
            from Ticket t in allTickets
            let hours = t.Bezoekrapport.Urens.
                Where(h =>
                    (dateFrom == null || h.Datum >= dateFrom)
                    && (dateTo == null || h.Datum <= dateTo)
                    && h.Uren1 > 0)
            select new RelationHoursTicketItem
             {
                 Date = t.DatumCreatie,
                 DateSolved = new DateTime(2012, 11, 11),
                 Ticket = t,
                 Relatie = t.Relatie,
                 TicketNr = t.Id,
                 TicketName = t.Titel,
                 TicketCategorie = t.TicketCategorie,
                 TicketPriority = t.TicketPrioriteit,
                 TicketRemark = t.TicketOpmerkings.SingleOrDefault(tr => tr.IsOplossing)
             };

问题出在 TicketRemark 中。执行数据后,我会收到数十个子查询,因为 TicketOpmerkings(TicketRemarks 的荷兰语)被逐个检索到。最初的意图是创建一个 IQueryable,它将作为所有其他查询的基础。我已经竭尽全力来实现这一点,创建自定义表达式来计算我从这个示例中删除的某些字段。

最好的方法是什么?为所有这些链接编写表达式,例如 t.TicketOpmerkingen?它将删除 LINQ 的一些最佳功能。到目前为止,我看到的解决方案包括手动创建表达式,但我也可以放弃这种方法并进行多个查询,每个查询都有其特定目的。然后我放弃了 LINQ 和 IQueryable 的简洁的“分层”方法。

有人有这方面的经验吗?

【问题讨论】:

    标签: c# .net linq-to-sql


    【解决方案1】:

    您所经历的被称为n+1 problem。当您使用 ORM 检索实体时会发生这种情况,使用 Deferred/Lazy Loading 功能。

    您检索链接到其他实体的实体。当您尝试导航到第二组实体时,ORM/Framework 当前尚未加载该实体。因此它会为您查询实体,让您按预期进行导航。

    有几种方法可以解决这个问题。以下是一些关于数据加载选项的文章:

    如果您使用的是 Linq to Sql:

    MSDN for DataLoadOptions

    A small article explaining the usage of DataLoadOptions

    对于实体框架:

    MSDN for ObjectQuery(Of T).Include

    An article describing eager loading techniques

    希望对您有所帮助。

    【讨论】:

    • 我已经设法用 LoadWith 修复它,我只需在设置后检索所需的票证: options.LoadWith(t => t.TicketOpmerkings);后来我遇到了一个不同的问题:我不能在 sql 上使用 order by,但我可以稍后对 enumerable 进行排序。
    • 优秀。在 L2S 中使用加载选项有一些缺点 - 首先,您只能在对上下文运行查询之前设置上下文的加载选项 - 这可能会导致问题,但希望不会对您不利。快乐编码 =)
    • 我很快发现,我只是为门票创建了一个单独的数据上下文。这意味着我稍后在编辑/更新时遇到了麻烦,但目前我所需要的只是检索大量连接的数据。以前的查询会话可能需要 分钟
    • 为什么不能使用 order by - 会发生什么?我以前没有遇到过这个问题。也许为新问题开始一个新问题?
    • 是的,我在单独的上下文中做同样的事情。这不是一个理想的做法,但通常我会尽量确保我只返回/公开不是从上下文派生的实体。我正在积极研究解决方案,如果我找到了,我会在这里为你写一个便条。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2010-09-11
    • 2011-07-12
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多