我尝试修改我的连接字符串以包含延长的超时,并且我已经确认在 sql 服务器端,馈送我的 EF 对象的视图在几秒钟内执行,并返回总共 3000 条或更少的记录。
但是当我尝试通过代码运行它时,我现在遇到了超时问题,我正在寻求一些建议来解决此问题。我收到"执行超时已过期。 在操作完成之前经过的超时期限或服务器没有响应。 我在特定错误上找到的大多数解决方案都建议修改连接字符串或与此相关的内容.context.CommandTimeout...在这种情况下,我不知道如何使用。
我已经包含了我用来获取所需数据的方法。如果有更有效的方法,请告诉我。
输入参数为:
int? inputSKU = null
int? inputStoreNum = null
DateTime? inputStartDate = null
目的是返回完整列表。
它挂起,因为它跳过了所有条件位: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() 总是强制它前面的所有内容立即评估, 而不是延迟执行。