使用ToList()转换LINQ查询结果时出现“执行超时”

时间:2018-06-20 09:59:31

标签: c# entity-framework linq

正如标题所述,我在要维护的模块上收到“等待操作超时”消息(内部异常消息:“超时已过期”)。每次应用尝试使用public Tuple<IEnumerable<ProductPriceSearchResultDto>, int> GetProductPriceSearchResults(ProductPriceFilterDto filter, int? pageNo = null) { //// Predicate builder var predicate = GetProductPriceSearchFilter(filter); //// This runs for approx. 1 minute before throwing a "Wait operation timed out" message... var query = this.GetProductPriceSearchQuery() .Where(predicate) .Distinct() .OrderBy(x => x.DosageFormName) .ToList(); return Tuple.Create<IEnumerable<ProductPriceSearchResultDto>, int>(query, 0); } 转换查询结果时,无论结果数量如何,它都会超时。

这需要转换为列表:结果需要导出到Excel以供下载。

下面是代码:

var query = (from price in this.context.ProductPrice.AsExpandable()
             join product in this.context.vwDistributorProducts.AsExpandable() 
                 on price.DosageFormCode equals product.DosageFormCode
             join customer in this.context.vwCustomerBranch.AsExpandable()
                 on price.CustCd equals customer.CustomerCode
             where price.CountryId == CurrentUserService.Identity.CountryId && !product.IsInactive
             select new { price.PriceKey, price.EffectivityDateFrom, price.ContractPrice, price.ListPrice,
                          product.DosageFormName, product.MpgCode, product.DosageFormCode,
                          customer.CustomerName }).GroupBy(x => x.DosageFormCode)
             .Select(x => x.OrderByDescending(y => y.EffectivityDateFrom).FirstOrDefault())
             .Select(
                 x =>
                 new ProductPriceSearchResultDto
                 {
                     PriceKey = x.PriceKey,
                     DosageFormCode = x.DosageFormCode,
                     DosageFormName = x.DosageFormName,
                     EffectiveFrom = x.EffectivityDateFrom,
                     Price = x.ListPrice,
                     MpgCode = x.MpgCode,
                     ContractPrice = x.ContractPrice,
                     CustomerName = x.CustomerName
                 }); 

return query;

我的查询:

ProductPrice

注释:

  1. CountryId是一个表,并且具有指向列DosageFormCodevwDistributorProducts的非聚集索引。
  2. vwCustomerBranchselect * from ( SELECT table_name, type, LISTAGG(privilege, '; ') WITHIN GROUP (ORDER BY privilege) privlist_agg FROM ALL_TAB_PRIVS group by table_name, type ) where not regexp_like(privlist_agg,'INSERT') order by type; 是从客户端数据库复制的视图。

我已经机智了。我如何摆脱这个错误?代码中是否需要更改?

编辑:我尽可能不希望设置命令超时,因为1.)应用程序到目前为止没有它就可以了...除了此功能和2。 ),这已经是一个巨大的应用程序,我不希望其他模块的性能受到威胁。

任何帮助将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

我会尝试并记录将其转换成的sql。 然后,可以使用实际的sql来获取查询计划,这可能使您更接近根本原因。