在尝试检索数据时,我遇到了实体框架的问题。 我将工作分成多个步骤:
Actualy,第1步和第2步非常快,第3步可能需要1分钟(200条记录)。这意味着它与SQL无关(我将查询从调试器复制到MSSMS,并且它在不到一秒的时间内执行)。
首先我使用步骤3B,为了简化,我检索了一个Job
实体,我将其转换为MapMarker
对象。而且我认为ConvertAll
正在减缓这个过程。
经过一些SO阅读后,我使用Select测试但结果是相同的。
唯一的问题是,如果我使用"主要对象",在这个例子中:Job,一切都很快;作为测试,我将Job.Job_ID放入所有字段,执行时间正常(不到一秒)。
然后我再次插入:,Latitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Latitude.Value
,慢慢回来。
我甚至尝试过使用foreach循环的步骤3C(我知道它不是更好但是没问题......)但它和其他解决方案一样慢。
主要问题是: EF6配置(或其他地方?)中缺少什么导致此过程如此缓慢?
我将以旧的方式执行并执行我自己的SQL查询,我开始使用EF,我想这些实体应该可用,现在使用"简单"对象工作真的很好,但如果你不能级联它们..增值是什么?
在我谈论的步骤之下。
第1步:
IEnumerable<Job> Jobs = db.Job.Include(e => e.Maintenance.MaintenancePlan.MaintenanceType).Include(e => e.Maintenance.MaintenancePlan.MaintenanceType)
.Include(e => e.Maintenance.MaintenancePlan.MaintenanceType.Shape)
.Include(e => e.Maintenance.MaintenanceStatus)
.Include(e => e.Users)
.Include(e => e.Users.Color)
.Include(e => e.Maintenance.Equipement.Location.GPS);
第2步:
List<Job> listJobs = Jobs.ToList();
步骤3A:
IEnumerable<MapMarker> IEMarkerJobsA = Jobs.AsEnumerable().Select(_Job => new MapMarker
{
ID = string.Format("Job_{0}", _Job.Job_ID)
,Latitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Latitude.Value
,Longitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Longitude.Value
});
List<MapMarker> listMarkerJobsA = IEMarkerJobsA.ToList();
步骤3B:
IEnumerable listMarkerJobs = listJobs.ConvertAll( new Converter(MapMarker.MapMarkerFactory)); 工厂是这样的:
public static MapMarker MapMarkerFactory(Job _Job)
{
MapMarker A = new MapMarker();
A.ID = String.Format("Job_{0}", _Job.Job_ID);
A.Latitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Latitude.Value;
A.Longitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Longitude.Value;
A.Title = String.Format("{1}", (_Job.Users != null) ? String.Format("[{0}]", _Job.Users.Users_NickName) : "", _Job.Maintenance.Equipement.Equipement_Name);
A.Icon = GetIconePath((_Job.Users != null) ? _Job.Users.Color.Color_Name : "red", _Job.Maintenance.MaintenancePlan.MaintenanceType.Shape.Shape_Name, _Job.Maintenance.MaintenanceStatus.MaintenanceStatus_Description, "13px");
A.IconSize = new Size(13, 13);
A.WindowInfoContent = String.Format("JobID= {0}", _Job.Job_ID);
return A;
}
步骤3C:
List<MapMarker> listMarkerJobs = new List<MapMarker>();
foreach (Job _Job in Jobs)
{
MapMarker A = new MapMarker();
A.ID = String.Format("Job_{0}", _Job.Job_ID);
A.Latitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Latitude.Value:
A.Longitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Longitude.Value;
A.Title = String.Format("{1}", (_Job.Users != null) ? String.Format("[{0}]", _Job.Users.Users_NickName) : "", _Job.Maintenance.Equipement.Equipement_Name);
A.Icon = MapMarker.GetIconePath((_Job.Users != null) ? _Job.Users.Color.Color_Name : "red", _Job.Maintenance.MaintenancePlan.MaintenanceType.Shape.Shape_Name, _Job.Maintenance.MaintenanceStatus.MaintenanceStatus_Description, "13px");
A.IconSize = new System.Drawing.Size(13, 13);
A.WindowInfoContent = String.Format("JobID= {0}", _Job.Job_ID);
listMarkerJobs.Add(A);
}
答案 0 :(得分:0)
试试第3部分
List<MapMarker> listMarkerJobs = Jobs.AsNoTracking().Select(_Job => new MapMarker
{
ID = string.Format("Job_{0}", _Job.Job_ID),
Latitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Latitude.Value,
Longitude = _Job.Maintenance.Equipement.Location.GPS.GPS_Longitude.Value
}).ToList();