Entityset在早期阶段转向IEnumerable
本文关键字:段转 IEnumerable Entityset | 更新日期: 2023-09-27 18:01:36
我有以下问题:我想在一个简洁的概述中显示来自帮助台系统的ticket。我还想显示数据的摘要,比如按优先级和类别分组。最重要的是,相同的数据必须转换为。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整洁的"分层"方法。
有人有这方面的经验吗?
您所遇到的情况被称为n+1问题。当您使用ORM检索实体时,使用延迟/延迟加载功能。
检索链接到其他实体的实体。当您尝试导航到第二组实体时,ORM/框架当前还没有加载实体。因此,它为您查询实体,允许您按照预期进行导航。
有几种方法可以解决这个问题。以下是一些关于数据加载选项的文章:
如果你正在使用Linq to Sql:
MSDN for DataLoadOptions
一篇解释DataLoadOptions用法的小文章
For Entity Framework:
MSDN for ObjectQuery(Of T).Include
一篇描述动态加载技术的文章
希望对你有帮助。