2012-01-28 4 views
0

У меня возникла проблема с производительностью скомпилированного запроса linq.Linq скомпилированный запрос и проблема с производительностью

using (var txn = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) 
     { 
      DateTime dealcheck = new DateTime(1753, 2, 2); 

      Func<DealDataClassesDataContext, string, IQueryable<DealsDetails>> DD = 
      CompiledQuery.Compile<DealDataClassesDataContext, string, IQueryable<DealsDetails>> 

    ((DealDataClassesDataContext nw, string sCity) => 

     from D in nw.Deals 

     where D.Address == City && (D.DealTime >= DateTime.Now || D.DealTime == dealcheck) && PriceMax >= D.DealPrice && D.DealPrice >= PriceMin && DisCountMax >= D.SavingsRate && D.SavingsRate >= DiscountMin && (D.DealTime >= DateTime.Now.AddDays(TimeMin) && D.DealTime <= DateTime.Now.AddDays(TimeMax) || D.DealTime == dealcheck) 

     select new DealsDetails(
          lst, 
          D.DealId, 
          D.DealHeadline, 
          D.DealCategory, 
          D.BuyPrice, 
          D.DealPrice, 
          D.SavingsRate, 
          D.SavingAmount, 
          D.RelatedWebsite, 
          D.Address, 
          string.Empty, 
          D.DealImage, 
          string.Empty, 
          string.Empty, 
          D.Time, D.CurrentTime, D.DealTime, 
         D.Location, string.Empty, string.Empty, D.Latitude, D.Longitude, D.Islocal, D.VendorMail, D.MerchantInfo, D.Review, D.HowItWork, D.DealUrl 
         )); 

      string jString = ""; 

      //int a = q(DealDbContext1, "London").Count(); 

      using (DealDataClassesDataContext db = new DealDataClassesDataContext()) 
      { 
       IQueryable<DealsDetails> DDD = DD.Invoke(DealDbContext, "London"); 

       if (lstSite.Count > 0 && lstSite[0] != "AllDeals") 
       { 
        DDD = DDD.Where(D => D.RelatedWebsite.Split(',').Where(x => lstSite.Contains(x)).Any()); //.Where(row => row.Category.ToList().Where(x => lst.Contains(x)).Any()).ToList(); 
       } 
       if (lst.Count > 0) 
       { 
        DDD = DDD.Where(D => D.Categories.Split(',').Where(x => lst.Contains(x)).Any()); //.Where(row => row.Category.ToList().Where(x => lst.Contains(x)).Any()).ToList(); 
       } 
       if (sortby == "Time" && orderby == "Asc") 
       { 
        DDD = (from d in DDD orderby d.Time ascending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else if (sortby == "Time" && orderby == "Desc") 
       { 
        DDD = (from d in DDD orderby d.Time descending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else if (sortby == "Price" && orderby == "Asc") 
       { 
        DDD = (from d in DDD orderby d.DealPrice ascending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else if (sortby == "Price" && orderby == "Desc") 
       { 
        DDD = (from d in DDD orderby d.DealPrice descending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else if (sortby == "Percent" && orderby == "Asc") 
       { 
        DDD = (from d in DDD orderby d.SavingsRate ascending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else if (sortby == "Percent" && orderby == "Desc") 
       { 
        DDD = (from d in DDD orderby d.SavingsRate descending select d).Skip((Page - 1) * PageSize).Take(PageSize); 
       } 
       else 
       { 
        DDD = DDD.Skip((Page - 1) * PageSize).Take(PageSize); 
       } 

       string Currency = "$"; 
       foreach (DealsDetails item in DDD) 
       { 
        //Creating Html String Here 
       } 

       return jString; 

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

Главным образом петля foreach takng более 17 секунд.

Пожалуйста, дайте мне знать, как скомпилировать этот запрос.

Спасибо заранее.

+0

Ваш вопрос на самом деле не имеют достаточно подробно, что вы пытались уже исправить это, но я искренне сомневаюсь, что 20 секунд имеют ничего общего с Linq часть. Я предлагаю вам проверить, используя профилировщик в менеджере SQL, какой запрос фактически передан в базу данных, он, вероятно, не будет работать быстрее, если вы запустите его вручную для базы данных. –

ответ