实体框架的性能问题

时间:2019-03-05 15:02:32

标签: c# sql-server entity-framework

我进行以下查询。由于信息量太少,它太慢了。首先,我提取一些数据并将其过滤掉,并将其存储在filts变量内的第二个查询中,然后基于该数据从数据库中提取其他数据集(快速加载)。有没有一种方法可以执行此过滤,而无需先提取所有数据然后进行过滤,例如,是否可以通过某种方式直接在数据库中进行过滤?正常的做法是什么?此查询有时需要15秒钟以上。规格包含约10万个完整内容,包含约30K个内容。我需要让查询在不到半秒的时间内工作。 IncludeAction指示应与项目本身一起拉出哪些外键项目。

  var filts = new HashSet<int>(_uow.SpecialitiesRepository.GetAllAsQueryableAsNoTracking(IncludeAction<Speciality>.None)
                                       .Where(x => byPrice ? x.Price >= pl && x.Price <= pr : true)
                                       .Select(x => x.Id))
                                       .AsParallel(); 

  var query = _uow.SpecialitiesRepository.GetAllAsQueryableAsNoTracking(new IncludeAction<Speciality>(x => x.Include(t => t.Institution)))
                                         .Where(sp => filts.Contains(sp.Id))
                                         .AsParallel()
                                         .ToList() <--- this is needed in order to be able to use Institution in further filterings
                                         .Where(sp => byRegion ? sp.Institution.Region.ToString("G").ToLowerInvariant() != region.ToLowerInvariant() : true)
                                               && Institution.Countries[sp.Institution.CountryCode.ToLower()].Alpha2.ToLowerInvariant() ==
                                               lowerCountry : true)
                                         .AsParallel();

0 个答案:

没有答案