繁体   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