我创建了 asp mvc 项目,它从大型 Mysql 数据库 ~ 500000 获取数据。
我使用单独的列过滤器将数据表添加到前端,其中仅显示 10 个条目。
data = dc.books.OrderBy(x => x.id).Where(x =>
(market_id == 0 || x.market_id == market_id)
&& (name == null || x.name != null && (x.name.Contains(name)))
&& (author == null || x.author != null && (x.author.Contains(author)))
).Skip(param.Start).Take(10).ToList();
工作又快又好。
当我尝试在筛选器后添加计数以进行分页时。无法工作服务器Mysql超时错误或工作速度非常慢
count = db.books.Count(x =>
(market_id == 0 || x.market_id != 0 && x.market_id == market_id)
&& (name == null || x.name != null && (x.name.StartsWith(name)))
为什么计数不工作或者这么慢?
我的 Controller 的所有代码 here
最佳答案
你最好这样做:
var query = db.books.AsQueryable();
if (market_id!=0)
query = query.Where(x=>x.market_id==market_id);
if (name!=null)
query = query.Where(x=>x.name.StartsWith(name));
count = query.Count();
data = query
.OrderBy(x=>x.id)
.Skip(param.Start)
.Take(10)
.ToList();
并非所有 LINQ 提供程序都能很好地优化过滤器,并将它们传递到数据库。许多数据库将为这些类型的查询生成一个糟糕的查询计划,并生成最坏情况下的查询计划并将其重新用于所有类似的查询,这将错过使用通常情况下使用索引的可能性。使用上面的代码。
在很多情况下,您可能还想限制计数,因此您可以这样做:
count = query.Take(1001).Count();
然后,如果 count == 1001,则使用消息“超过 1000 个结果。”
关于c# - Linq 和 .Count 大数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43830388/