1

我试图修改我的连接字符串以包含一个扩展超时,并且我已经确认在 sql server 端,提供我的 EF 对象的视图在几秒钟内执行并返回总共 3000 或更少的记录。

但是当我尝试通过代码运行它时,我现在遇到了超时问题,我正在寻求一些建议来解决这个问题。我得到“执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。” 我在特定错误中找到的大多数解决方案都建议修改连接字符串或 this.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;
}
4

2 回答 2

4

如果您使用的是最新的 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();
于 2017-06-22T11:06:20.973 回答
0
// 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() 总是强制它前面的所有内容立即评估,而不是延迟执行。

于 2017-06-22T21:01:20.530 回答