簡體   English   中英

實體框架對象LINQ查詢超時問題

[英]Entity Framework object LINQ query Timeout issues

我試圖修改我的連接字符串以包括延長的超時時間,並且我已經確認在sql服務器端,用於饋送EF對象的視圖會在幾秒鍾內執行,並返回總計3000條或更少的記錄。

但是,當我嘗試通過代碼運行它時,我現在遇到了超時問題,我正在尋求一些建議來解決此問題。 我收到“執行超時到期。在操作完成之前超時或服務器沒有響應的超時時間。” 我發現的針對特定錯誤的大多數解決方案都建議修改連接字符串或this.context.CommandTimeout ...中的某些內容,在這種情況下我不知道該如何使用。

我已經包括了用來獲取所需數據的方法。 如果有更有效的方法,請告訴我。

輸入參數為:

  • int? inputSKU = null
  • int? inputStoreNum = null
  • DateTime? inputStartDate = null

目的是返回完整列表。

它會var qUniqueOffers = query.GroupBy(q => q.Plan_Number).ToList(); ,因為它會跳過所有條件位: var qUniqueOffers = query.GroupBy(q => q.Plan_Number).ToList();

謝謝。


private List<PromotionItem> QueryPromotion(int? inputSKU, int? inputStoreNum, DateTime? inputStartDate)
{
    log.Info("Client requested QueryPromotion");
    List<PromotionItem> resultQuery = new List<PromotionItem>();

    try
    {
        using (DWH_Entities db = new DWH_Entities())
        {
            var query = db.vw_Web_Promotion.AsQueryable();

            // filter promotion results that don't match SKU#
            if (inputSKU != null)
                query = query.Where(q => q.Sku_Number == inputSKU);
            // filter promotion results that don't match Store Num
            if (inputStoreNum != null)
                query = query.Where(q => q.Store_Number == inputStoreNum);
            // filter promotion results that don't match Promotion Start Date
            if (inputStartDate != null)
                query = query.Where(q => q.Start_Date >= inputStartDate);
            // Group promotions By Plan Number ('Promotion ID')
            var qUniqueOffers = query
                                .GroupBy(q => q.Plan_Number)
                                .ToList();
            // Select first from each group to get unique details
            var qOffers = qUniqueOffers
                        .Select(g => g.OrderBy(gi => gi.Plan_Number).First())
                        .ToList();

            foreach (var qo in qOffers)
            {
                resultQuery.Add(new PromotionItem
                {
                    PromotionNumber = qo.Plan_Number.Trim(),
                    PromotionDescription = qo.Plan_Description.Trim(),
                    StartDate = qo.Start_Date,
                    EndDate = qo.End_Date
                });
            }
        }
    }
    catch (Exception e)
    {
        log.Error("[" + e.TargetSite + "] | " + e.Message);
        throw e;
    }

    return resultQuery;
}

如果您使用的是最新的EF版本,請執行以下操作以增加超時:

using (DWH_Entities db = new DWH_Entities())
{
    db.Database.CommandTimeout = 300;
    ...

如果要在最短時間內記錄,請嘗試以下操作:

var temp = query.ToList();
var qUniqueOffers = temp.GroupBy(q => q.Plan_Number)
                                .ToList();
// Group promotions By Plan Number ('Promotion ID')
var qUniqueOffers = query
                    .GroupBy(q => q.Plan_Number)
                    .ToList();
// Select first from each group to get unique details
var qOffers = qUniqueOffers
            .Select(g => g.OrderBy(gi => gi.Plan_Number).First())
            .ToList();

上面LINQ的編寫方式意味着您要通過網絡(第一個ToList )提取大量數據,然后獲取數據的子集(使用First和第二個ToList )。 考慮將其更改為:

// Group promotions By Plan Number ('Promotion ID')
var qUniqueOffers = query
                    .GroupBy(q => q.Plan_Number)
// Select first from each group to get unique details
var qOffers = qUniqueOffers
            .Select(g => g.OrderBy(gi => gi.Plan_Number).First())
            .ToList();

這將導致從數據庫發送的數據少得多 -希望可以使其更快。

https://stackoverflow.com/a/13827077/34092所述:

與延遲執行相反,ToList()始終強制其前面的所有內容立即進行評估。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM