在使用连接到SQL Server的`DbContext`的情况下,在Visual Studio 2013 Update 1中使用Entity Framework 6.0.2和.NET 4.5.1:
我有一个长链的过滤器,基于调用者所需的结果应用到查询中。一切都很好,直到我需要添加分页功能。以下是一个概览:
这是我添加到底部的分页代码(其中
我有一个长链的过滤器,基于调用者所需的结果应用到查询中。一切都很好,直到我需要添加分页功能。以下是一个概览:
IQueryable<ProviderWithDistance> results = (from pl in db.ProviderLocations
let distance = pl.Location.Geocode.Distance(_geo)
where pl.Location.Geocode.IsEmpty == false
where distance <= radius * 1609.344
orderby distance
select new ProviderWithDistance() { Provider = pl.Provider, Distance = Math.Round((double)(distance / 1609.344), 1) }).Distinct();
if (gender != null)
{
results = results.Where(p => p.Provider.Gender == (gender.ToUpper() == "M" ? Gender.Male : Gender.Female));
}
if (type != null)
{
int providerType;
if (int.TryParse(type, out providerType))
results = results.Where(p => p.Provider.ProviderType.Id == providerType);
}
if (newpatients != null && newpatients == true)
{
results = results.Where(p => p.Provider.ProviderLocations.Any(pl => pl.AcceptingNewPatients == null || pl.AcceptingNewPatients == AcceptingNewPatients.Yes));
}
if (string.IsNullOrEmpty(specialties) == false)
{
List<int> _ids = specialties.Split(',').Select(int.Parse).ToList();
results = results.Where(p => p.Provider.Specialties.Any(x => _ids.Contains(x.Id)));
}
if (string.IsNullOrEmpty(degrees) == false)
{
List<int> _ids = specialties.Split(',').Select(int.Parse).ToList();
results = results.Where(p => p.Provider.Degrees.Any(x => _ids.Contains(x.Id)));
}
if (string.IsNullOrEmpty(languages) == false)
{
List<int> _ids = specialties.Split(',').Select(int.Parse).ToList();
results = results.Where(p => p.Provider.Languages.Any(x => _ids.Contains(x.Id)));
}
if (string.IsNullOrEmpty(keyword) == false)
{
results = results.Where(p =>
(p.Provider.FirstName + " " + p.Provider.LastName).Contains(keyword));
}
这是我添加到底部的分页代码(其中
skip
和max
只是int类型的参数)。if (skip > 0)
results = results.Skip(skip);
results = results.Take(max);
return new ProviderWithDistanceDto { Locations = results.AsEnumerable() };
现在轮到我问问题了:
你可以看到,在最初的LINQ查询中,我正在使用orderby,那么为什么它会抱怨我需要在执行
Skip
之前进行OrderBy
呢?(我以为我已经这样做了?)...我认为只有当我枚举结果时,它才会被转换为SQL查询并执行,这就是为什么我等到最后一行才返回结果的AsEnumerable()。这是正确的方法吗?
如果我必须在执行
Skip
和Take
之前枚举结果,那么这将如何影响性能?显然,我希望SQL Server进行繁重的工作并仅返回请求的结果。或者这不重要(或者我搞错了)?