【问题标题】:Entityframework 6.2.0 IQueryable.Count VS IQueryable.ToList().Count实体框架 6.2.0 IQueryable.Count VS IQueryable.ToList().Count
【发布时间】:2018-05-23 02:01:41
【问题描述】:

这是一个很奇怪的问题 总之

var q = (some query).Count();

给我一​​个号码,然后

var q = (some query).ToList().Count();

给我完全不同的数字...

提到(某些查询)有两个包含(连接)

有没有合理的解释???

编辑:这是我的查询

var q = db.membership_renewals.Include(i => i.member).Include(i => i.sport).Where(w => w.isDeleted == false).Count();

这给了我一个错误的号码

还有这个:

var q = db.membership_renewals.Include(i => i.member).Include(i => i.sport).Where(w => w.isDeleted == false).ToList().Count();

给我准确的数字..

编辑 2 当我将查询编写为 linq 查询时,它运行良好......

var q1 = (from d in db.membership_renewals where d.isDeleted == false join m in db.members on d.mr_memberId equals m.m_id join s in db.sports on d.mr_sportId equals s.s_id select d.mr_id).Count();

我认为实体框架不执行原始查询中的连接而是强制在 (ToList()) 中执行它们的问题...

【问题讨论】:

  • 在不了解查询的情况下,我们无话可说
  • 编写代码示例,以便人们理解问题并为您提供相关答案。
  • 好的,我将查询代码编写为编辑...

标签: entity-framework entity-framework-core iqueryable


【解决方案1】:

我终于知道发生了什么... 数据库表在数据库中没有链接在一起(数据库本身没有定义关系或约束),因此代码不执行(内部连接)部分。 但是另一方面,我的类写得很好,所以当我执行 (ToList()) 时,它会自动忽略未绑定的行...... 当我编写定义关系键(主键和外键)的 linq 查询时,它工作正常,因为现在数据库了解我的表之间的关系...... 谢谢大家,你们都很棒....

【讨论】:

    【解决方案2】:

    我的猜测是 IQueryable 给出了一个较小的数字,因为不是所有的对象都被加载,有点像 Java 中的流,但是 IQueryable.toList().count() 强制 Iqueryable 加载所有数据并且它被遍历列表构造函数并存储在列表中,因此 IQueryable.toList().Count() 是准确的答案。这是基于在 MSDN 上的 5 分钟搜索。

    这个想法是 IQueryable 的底层数据存储是一个数据库迭代器,因此它每次执行的方式都不同,因为它在数据库上再次执行查询,所以如果你对同一个表调用它两次,并且数据已经改变,你会得到不同的结果。这称为延迟执行。但是当您说 IQueryable.ToList() 时,您会强制迭代器进行一次整个迭代并将结果转储到一个恒定的列表中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 2013-08-10
      • 2014-04-06
      • 2014-04-17
      • 2011-03-29
      • 2015-01-31
      • 1970-01-01
      相关资源
      最近更新 更多