在订购前计数,跳过并采取

时间:2014-10-23 08:37:08

标签: entity-framework entity-framework-6

我正在使用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))
                ));

不幸的是,这导致了很多冗余,我的查询执行了两次。有没有更好的解决方案?

1 个答案:

答案 0 :(得分:0)

我同意冗余。您可以做的是将特定参数(keyword,dateTime)的计数结果缓存一定时间,并在后续调用中再次使用它来从StammDatenRepository传递分页(skip,take)结果。

这样,您只能对特定参数进行一次总计数调用。

发现this SO question受尊敬的成员声明:

  

从SQL的角度思考它,我想不出办法   一个普通的查询来检索总计数和子集   数据,所以我认为你也不能在LINQ中做到这一点。

所以,我真的认为你必须缓存一些计数结果以提高性能。你知道如何根据你的具体情况做到这一点,以及它是否值得...