Entityframework 6.2.0 IQueryable.Count VS IQueryable.ToList()。Count

时间:2017-12-08 19:22:21

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

这是一个非常奇怪的问题 简而言之

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())中执行它们的问题......

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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