[英]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.