c# - Linq 和 .Count 大数据库

标签 c# mysql linq

我创建了 asp mvc 项目,它从大型 Mysql 数据库 ~ 500000 获取数据。

我使用单独的列过滤器将数据表添加到前端,其中仅显示 10 个条目。

enter image description here

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/

相关文章:

c# - 需要在运行时使用 Azure Function 中的 ServiceProvider 创建服务

c# - 如何在pcm流(C#)中查找音频功率(db)

php - PHP 和 MySQL 中的日期

c# - 在 LINQ Select 语句中调用返回 true

c# - 如何在 C#/.NET 中使用 LINQ 表达式树调用 lambda

c# - 找到一系列连接点之间的闭环

c# - 在 WCF 中序列化时不包括 IComparable

UNION 的 MySql CONCATENATE 结果

php - MySQL 可用性日历 - 计算空闲日期的方法?

c# - 获取异常 ""至少一个对象必须实现 icomparable""只有在将方法 ToList() 应用于 IQueryable<> 时