2012-01-28 75 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; 

我附上了我的整個代碼,請檢查一下這個問題是什麼,它需要很長的時間才能回覆20秒。

主要是foreach循環超過17秒。

請讓我知道如何編譯此查詢。

在此先感謝。

+0

你的問題並沒有真正有足夠的細節,你嘗試過什麼已經解決這個問題,但我真誠地相信20秒什麼做LINQ的部分。我建議你使用SQL管理器中的分析器檢查實際傳遞給數據庫的查詢,如果你對數據庫手動運行,它可能不會運行得更快。 – 2012-01-28 06:31:21

回答