EntityFrameworkLINQ查询计数失败,但查询返回结果。如何优化LINQ查询?我有以下执行自左外连接的LINQ查询。该查询看起来有点复杂,但它只是在进行自连接(目的是将每条记录与前一个工作日的记录连接起来),然后进行一些参数化过滤。varnewBreakThreshold=decimal.Parse(WebConfigurationManager.AppSettings["NewBreakThreshold"]);使用(vardbContext=newNavFoToBoCompareDbContext()){varquery=fromcurrentindbContext.NAVSummariesletcurrentWD=SqlFunctions.DatePart("dw",current.ValueDate)letcurrentPD=DbFunctions.AddDays(current.ValueDate,currentWD==2?-3:currentWD==1?-2:-1).ValuejoinpreviousindbContext.NAVSummariesonnew{current.Portfolio,PD=currentPD}equalsnew{previous.Portfolio,PD=previous.ValueDate}到previousGroup从previousGroup.DefaultIfEmpty()//LEFTOUTERJOINselectnew{outer=current,inner=previous};如果(dateStart.HasValue)query=query.Where(e=>e.outer.ValueDate>=dateStart.Value);如果(dateEnd.HasValue)query=query.Where(e=>e.outer.ValueDatee.outer.Portfolio.Equals(portfolio,StringComparison.OrdinalIgnoreCase));如果(!owner.Equals("ALL",StringComparison.OrdinalIgnoreCase))曲ery=query.Where(e=>e.outer.PortfolioOwner.Equals(owner,StringComparison.OrdinalIgnoreCase));if(status!=0)query=query.Where(e=>e.outer.Statuses.Any(s=>s.StatusId==status));varquery2=query.Select(s=>new{BackOfficeNAV=s.outer.BackOfficeNAV,FrontOfficeNAV=s.outer.FrontOfficeNAV,Threshold=s.outer.Threshold,ExtractId=s.outer.ExtractId,ExtractStatus=s.outer.ExtractStatus,PortfolioOwner=s.outer.PortfolioOwner,DateTimeModified=s.outer.DateTimeModified,MostCorrectNAV=s.outer.MostCorrectNAV,Comments=s.outer.Comments,Statuses=s.outer.Statuses,Extracts=s.outer.Extracts,投资组合=s.outer.Portfolio,ValueDate=s.outer.ValueDate,DifferencePercent=s.outer.DifferencePercent,DayOverDayChange=s.outer.DifferencePercent-s.inner.DifferencePercent,IsChange=s.inner.DifferencePercent!=s.outer.DifferencePercent,PreviousValueDate=s.inner.ValueDate,PreviousDifferencePercent=s.inner.D差异百分比});query2=query2.Where(r=>"NEW".Equals(breakOption,StringComparison.OrdinalIgnoreCase)?((r.DifferencePercent>r.Threshold)&&r.IsChange&&r.DayOverDayChange>newBreakThreshold):"OLD".等于(breakOption,StringComparison.OrdinalIgnoreCase)?(r.DifferencePercent>r.Threshold):"ALL".Equals(breakOption,StringComparison.OrdinalIgnoreCase));varresultCount=query2.Count();在方法中使用时,它用于计算分页所需的计数。在另一种方法中,它用于从数据库中获取实际结果。获取更大结果集的实际结果的实现成功执行,而Count()查询失败并出现超时异常。注意:两种实现是相同的。也有人可以帮我优化这个查询。提前致谢。不太确定这是问题所在,但至少让我们尝试通过手动构建具有常量值的表达式来消除dateStart/dateEnd参数,从而消除所谓的参数嗅探问题的潜在影响。首先,一个小帮助方法:usingSystem;使用System.Linq;使用System.Linq.Expressions;publicstaticclassQueryableUtils{publicstaticIQueryableWhereBetween(thisIQueryablesource,Expression>dateSelector,DateTime?startDate,DateTime?endDate){if(startDate==null&&endDate==null)返回源;varstartCond=startDate!=null?Expression.GreaterThanOrEqual(dateSelector.Body,Expression.Constant(startDate.Value)):null;varendCond=endDate!=null?Expression.LessThanOrEqual(dateSelector.Body,Expression.Constant(endDate.Value)):null;varpredicate=Expression.Lambda>(startCond==null?endCond:endCond==null?startCond:Expression.AndAlso(startCond,endCond),dateSelector.Parameters[0]);返回source.Where(predicate);}}然后尝试下面操作,看它是否有帮助://if(dateStart.HasValue)//query=query.Where(e=>e.outer.ValueDate>=dateStart.Value);//if(dateEnd.HasValue)//query=query.Where(e=>e.outer.ValueDatee.outer.Value日期、日期开始、日期结束);您可以简单地使用AsParallel()启用linq查询的多线程执行然后您应该检查表的索引以提高性能。以上是C#学习教程:EntityFrameworkLINQ查询计数失败,但查询返回结果。如何优化LINQ查询?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
