Entityset在早期阶段转向IEnumerable

时间:2011-07-08 08:58:32

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

我有以下问题:我想在整洁的概述中显示帮助台系统中的票证。我还想显示数据摘要,例如按优先级和类别分组。最重要的是,必须将相同的数据转换为.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的Dutch)会逐个检索。最初的目的是创建一个IQueryable,它将作为所有其他查询的基础。我已经花了很大力气来实现这一目标,创建自定义表达式来计算我从这个例子中删除的某些字段。

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

有人对此有过一些经验吗?

1 个答案:

答案 0 :(得分:2)

您遇到的情况称为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

希望有所帮助。