我正在使用Entity Framework以及工作单元和存储库模式。
对于具有排序,分页等的功能,我使用以下代码:
stammdatenEntityModels =
_unitOfWork.StammdatenRepository.Get()
.Where(
s =>
s.Geloescht == false &&
((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
(s.SerienNummer.Contains(keyword)) ||
(s.Bezeichnung.ToLower().Contains(keyword)) ||
(s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
(s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
(s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
(s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
))
.OrderBy(orderBy)
.Skip(inputModel.EntriesToDisplay*(inputModel.Page - 1))
.Take(inputModel.EntriesToDisplay)
.ToList();
现在我需要知道记录的数量,但是在跳过和拍摄(用于分页)之前。
因此我再次使用相同的代码:
totalCount = _unitOfWork.StammdatenRepository.Get()
.Count(
s =>
s.Geloescht == false &&
((s.Auftraggeber != null && s.Auftraggeber.Bezeichnung.ToLower().Contains(keyword)) ||
(s.SerienNummer.Contains(keyword)) ||
(s.Bezeichnung.ToLower().Contains(keyword)) ||
(s.StammdatenKunde != null && s.StammdatenKunde.Name.ToLower().Contains(keyword)) ||
(s.BeginnVos.HasValue && s.BeginnVos == dateTime) ||
(s.VosDauer != null && s.VosDauer.Bezeichnung.ToLower().Contains(keyword)) ||
(s.Geraetewert.HasValue && s.Geraetewert.Value.ToString().Contains(keyword))
));
不幸的是,这导致了很多冗余,我的查询执行了两次。有没有更好的解决方案?
答案 0 :(得分:0)
我同意冗余。您可以做的是将特定参数(keyword,dateTime)的计数结果缓存一定时间,并在后续调用中再次使用它来从StammDatenRepository传递分页(skip,take)结果。
这样,您只能对特定参数进行一次总计数调用。
发现this SO question受尊敬的成员声明:
从SQL的角度思考它,我想不出办法 一个普通的查询来检索总计数和子集 数据,所以我认为你也不能在LINQ中做到这一点。
所以,我真的认为你必须缓存一些计数结果以提高性能。你知道如何根据你的具体情况做到这一点,以及它是否值得...