我正在使用 EntityFramework 6,我从 Asp.NET 服务器向 azure sql 数据库进行 Linq 查询。
我需要检索满足特定条件的最新 20 行
这是我的查询的粗略示例
using (PostHubDbContext postHubDbContext = new PostHubDbContext())
{
DbGeography location = DbGeography.FromText(string.Format("POINT({1} {0})", latitude, longitude));
IQueryable<Post> postQueryable =
from postDbEntry in postHubDbContext.PostDbEntries
orderby postDbEntry.Id descending
where postDbEntry.OriginDbGeography.Distance(location) < (DistanceConstant)
select new Post(postDbEntry);
postQueryable = postQueryable.Take(20);
IOrderedQueryable<Post> postOrderedQueryable = postQueryable.OrderBy(Post => Post.DatePosted);
return postOrderedQueryable.ToList();
}
问题是,如果我的数据库中确实有十亿行怎么办。该查询是否会粗暴地选择满足条件的数百万行然后获取其中的 20 行?或者它会很聪明,意识到我只需要 20 行,因此它只会选择 20 行?
基本上,我如何使此查询高效地处理具有十亿行的数据库?
请您参考如下方法:
根据 http://msdn.microsoft.com/en-us/library/bb882641.aspx Take() 函数延迟了流式执行和 select 语句。这意味着它应该等同于 SQL 中的 TOP 20,并且 SQL 只会从数据库中获取 20 行。
此链接:http://msdn.microsoft.com/en-us/library/bb399342(v=vs.110).aspx显示 Take 在 Linq-to-SQL 中有直接翻译。
所以你唯一能做的就是数据库。就像@usr 建议的那样,您可以使用索引来提高性能。此外,按排序顺序存储表也有很大帮助(这很可能是您按 ID 排序时的情况)。
