EF6级联对象设置速度很慢

时间:2016-03-09 14:58:44

标签: c# performance entity-framework

在尝试检索数据时,我遇到了实体框架的问题。 我将工作分成多个步骤:

  1. 生成查询
  2. 执行它并从db中检索数据集。
  3. 使用数据集填写我的ViewModel。
  4. 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);
                }
    

1 个答案:

答案 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();