如何优化此LINQ查询?它运行localhost但它不能在Azure

时间:2016-09-08 22:17:50

标签: linq entity-framework-6

我有这个LINQ查询并且正在获得我需要的结果。但是在localhost上显示结果需要5-6秒,而我甚至无法在Azure上运行此操作。 我是LINQ的新手,我确信我做的事情效率低下。 有人可以指导我进行优化吗?

var joblist = (from t in db.Tracking
               group t by t.JobNumber into j
               let id = j.Max(x => x.ScanDate)
               select new
               {
                   jn = j.Key,
                   ti = j.FirstOrDefault(y => y.ScanDate == id).TrackingId,
                   sd = j.FirstOrDefault(y => y.ScanDate == id).ScanDate,
                   lc = j.FirstOrDefault(y => y.ScanDate == id).LocationId
               }).Where(z => z.lc == lid).Where(z => z.jn != null);

 jfilter = (from tr in joblist
            join lc in db.Location on tr.lc equals lc.LocationId
            join lt in db.LocType on lc.LocationType equals lt.LocationType
            select new ScanMod
            {
                TrackingId = tr.ti,
                LocationName = lc.LocationName,
                JobNumber = tr.jn,
                LocationTypeName = lt.LocationTypeName,
                ScanDate = tr.sd,
                StoneId = ""
            }).OrderByDescending(z => z.ScanDate);

更新 此查询在Azure(s1)上运行,但需要30秒。这个表有500,000行,我假设OrderByDescending或FirstOrDefault正在杀死它......

var joblist = db.Tracking
              .GroupBy(j => j.JobNumber)
              .Select(g => g.OrderByDescending(j => j.ScanDate).FirstOrDefault());

jfilter = (from tr in joblist
           join lc in db.Location on tr.LocationId equals lc.LocationId
           join lt in db.LocType on lc.LocationType equals lt.LocationType
           where tr.LocationId == lid
           select new ScanMod
           {
                TrackingId = tr.TrackingId,
                LocationName = lc.LocationName,
                JobNumber = tr.JobNumber,
                LocationTypeName = lt.LocationTypeName,
                ScanDate = tr.ScanDate,
                StoneId = ""
            }).OrderByDescending(z => z.ScanDate);

0 个答案:

没有答案