2013-12-23 4 views
0

Я разрабатываю беспроводное приложение, когда я запрашиваю 2000+ строк из SQL Server 2008, исключение таймаута происходит.Исключение таймаута SQL Server 2008

Я использую много linq в своей программе в цикле. Когда я прокомментирую некоторые из них, это будет лучше, но все же произойдет.

Является ли Linq причиной низкой производительности? Есть ли другая причина, вызывающая эту проблему? И как я могу это решить?

Спасибо.

enter code here 
        var listShipUnit = from ShipUnit su in bdd.ShipUnit 
             where (su.ShipmentID == shipmentNumber 
             && (su.QStatus != "1" || su.QStatus == null) 
             && (!su.CaseID.Equals(null) 
             && !su.CaseID.ToUpper().Equals("UNKNOWN") && 
             !su.CaseID.Equals(string.Empty) && 
             !su.CaseID.ToUpper().Equals("NULL") 
             && su.CaseID.Length > 0)) 
              group su by su.CaseID into gsu 
              select new 
              { 
               gsu.Key, 
               gsu, 
               TotalWeight = gsu.Sum(w => w.Weight), 
               TotalVolume = gsu.Sum(v => v.Volume), 
               TotalCount = gsu.Sum(v => v.ShipUnitCount) 
              }; 



        foreach (var shipUnit in listShipUnit) 
        { 
         tempListShipUnitGroup.Add(new ShipUnitGroupSTL(shipUnit.gsu.ToList(), shipUnit.Key, shipUnit.TotalVolume.ToString(), shipUnit.TotalWeight.ToString(), shipUnit.TotalCount.ToString())); 
        } 

        List<ShipUnitGroupSTL> revShipUnitGroup = new List<ShipUnitGroupSTL>(); 
        List<string> finishPallet = new List<string>(); 
        List<string> finishCase = new List<string>(); 


        // 2013.12.19 device null exception ---> start 
        var stlunits = bdd.ScanToLoad; 
        List<ScanToLoad> stlList = stlunits.ToList(); 

        //var shipunits = bdd.ShipUnit; 
        //List<ShipUnit> shipunitList = shipunits.ToList(); 

        if (stlList != null && stlList.Count() > 0) 
        // 2013.12.19 device null exception --- end 
        { 
         //// get the recently record from STL talbe 
         foreach (var shipUnitGroup in tempListShipUnitGroup) 
         { 
          string tempCaseID; 
          string tempPalletID; 

          var unit = shipUnitGroup.GroupShipUnit; 


          tempCaseID = shipUnitGroup.GroupKey; 
          tempPalletID = unit.FirstOrDefault().PalletID; 

         // // 2013.12.19 device null exception ---> start 
         // // look up the caseId in the STL table 
          var stlunit = stlList 
             .Where(s => s.CaseID.Equals(tempCaseID)) 
             .OrderByDescending(s => s.UpdateDate); 

         // //var stlunit = bdd.ScanToLoad 
         // //   .Where(s => s.ScanToLoadID.Equals(tempCaseID) 
         // //    || s.CaseID.Equals(tempCaseID)) 
         // //   .OrderByDescending(s => s.UpdateDate); 

         // // 2013.12.19 device null exception ---> end 



          if (stlunit != null && stlunit.Count() > 0) 
          { 
           string stlPallet = null; 

           stlPallet = stlunit.FirstOrDefault().NewPalletID; 

           if (!string.IsNullOrEmpty(stlPallet)) 
           { 
            if (tempPalletID.Equals(stlPallet)) 
            { 
             finalListShipUnitGroup.Add(shipUnitGroup); 
             //continue; 
            } 
            else 
            { 
             var revShipUnit = bdd.ShipUnit 
                .Where(su => su.ShipmentID == shipmentNumber 
                 && (su.QStatus != "1" || su.QStatus == null) 
                 && su.PalletID.Equals(stlPallet)); 

             if (revShipUnit != null && revShipUnit.Count() > 0) 
             { 
              unit.FirstOrDefault().PalletID = stlPallet; 
              finalListShipUnitGroup.Add(shipUnitGroup); 
             } 
            } 
           } 
           else 
           { 
            finalListShipUnitGroup.Add(shipUnitGroup); 
            //continue; 
           } 


          } 
          else 
          { 
           finalListShipUnitGroup.Add(shipUnitGroup); 
           //continue; 
          } 

          finishCase.Add(tempCaseID); 
          var checkFinshPallet = finishPallet 
                .Contains(tempPalletID); 

          if (checkFinshPallet) 
          { 
           continue; 
          } 

          finishPallet.Add(tempPalletID); 

         } 


         foreach (var tempPalletID in finishPallet) 
         { 
          // look up the pallet in the STL table, add others new caseId in STL table 
          var stlunitPal = stlList 
             .Where(s => s.NewPalletID.Equals(tempPalletID)) 
             .OrderByDescending(s => s.UpdateDate); 

          if (stlunitPal != null && stlunitPal.Count() > 0) 
          { 
           //IEnumerable<MobilePlusServer.ShipUnit> newCaseList; 
           string stlPalletID; 

           // add and remove case from the Pallet 
           foreach (var s in stlunitPal) 
           { 
            stlPalletID = s.NewPalletID; 

            //var addSus = from ShipUnit su in bdd.ShipUnit 
            //    where (su.CaseID.Equals(s.CaseID) && su.RecordID.Equals(s.CaseRecordID)) 
            //     && (su.QStatus != "1" || su.QStatus == null) 
            //    group su by su.CaseID into gsu 
            //    select new 
            //    { 
            //     gsu.Key, 
            //     gsu, 
            //     TotalWeight = gsu.Sum(w => w.Weight), 
            //     TotalVolume = gsu.Sum(v => v.Volume), 
            //     TotalCount = gsu.Sum(v => v.ShipUnitCount) 
            //    }; 

            var addSus = from ShipUnit su in bdd.ShipUnit 
               where (su.CaseID.Equals(s.CaseID) && su.RecordID.Equals(s.CaseRecordID) 
                && (su.QStatus != "1" || su.QStatus == null)) 
               select su; 


            if (addSus != null && addSus.Count() > 0) 
            { 
             var addSu = addSus.FirstOrDefault(); 

             // get the remove pallet id 
             string adShipmentID = addSu.ShipmentID; 
             string adPalletID = addSu.PalletID; 
             //string adRecordID = unit.FirstOrDefault().RecordID.ToString(); 
             //string adCaseID = unit.FirstOrDefault().RecordID.ToString(); 
             if (!shipmentNumber.Equals(adShipmentID) 
              && !finishCase.Contains(s.CaseID)) 
             { 
              // set new pallet id 
              addSu.PalletID = stlPalletID; 

              finalListShipUnitGroup.Add(new ShipUnitGroupSTL(
               addSus.ToList(), 
               s.CaseID, 
               addSu.Volume.ToString(), 
               addSu.Weight.ToString(), 
               addSu.ShipUnitCount.ToString())); 
             } 
            } 
           } 
          } 
         } 
        } 
        // 2013.12.19 device null exception ---> start 
        else 
        { 
         finalListShipUnitGroup = tempListShipUnitGroup; 
        } 
+4

Linq - это слой, который немного замедляет работу, но это не ваша проблема. Отправьте код/​​запрос, который вы используете, и на этот вопрос будет намного легче ответить. – paqogomez

+6

** Покажите нам что-нибудь! ** Мы не можем видеть ваш экран и не читать ваш разум - вам нужно ** показать нам, что вы делаете. Как выглядят ваши таблицы, какие запросы вы используете против них? У вас есть индексы на этих таблицах - и если да, то ** какие ** индексы? Сколько строк в таблице, сколько вы читаете с вашими запросами? –

+0

@paqogomez linq не должен замедлять работу, особенно если оценка запроса не принудительно, а затем запрашивается далее (например, 'myquery.ToList(). Где (x => x.Thing == MatchingThing)'). – adhocgeek

ответ

1

вы можете использовать индексирование по SQL для получения быстрее запросы я рекомендую индекс использования на ваших вступающие полях

увидеть эту документацию here и here и here

+0

Спасибо Pouya. Я попробую. – Eric

0

Имея такие сложные запросы, может быть легко интерпретируется как показатель плохого дизайна (либо в запросах, либо в базе данных). Я предлагаю разбить ваши запросы на более мелкие, а затем составить их. Это приведет вас к более четкому коду и логике. Затем вы можете использовать SQL server profiler для просмотра точных запросов sql и посмотреть, связана ли задержка с переводом между Linq в Entities и SQL. Если вы уверены, что не можете сделать ваши запросы более простыми, тогда вы можете использовать indexing на уровне SQL Server

Надеюсь, я помог!

+0

Спасибо. Pantelis. Это действительно плохой дизайн, и так много сложного Linq. Я думаю, что это причина. Я попробую добавить индекс – Eric