实体框架中的可查询Linq查询差异

Chr*_*end 5 c# sql linq entity-framework

我在实体框架中有一个非常简单的多对多表,将我的批准连接到我的交易(如下所示).

在此输入图像描述

我正在尝试在批准对象内部进行查询以计算批准中的事务量,这应该相对容易.

如果我做这样的事情,那么它的工作速度非常快.

int count;
EntitiesContainer dbContext = new EntitiesContainer ();

var aCnt = from a in dbContext.Approvals
        where a.id == id
        select a.Transactions.Count;

count = aCnt.First();
Run Code Online (Sandbox Code Playgroud)

但是,当我这样做

count = Transactions.Count;
Run Code Online (Sandbox Code Playgroud)

或这个

count = Transactions.AsQueryable<Transaction>().Count();
Run Code Online (Sandbox Code Playgroud)

它非常慢.我已经跟踪了在服务器上运行的sql,它确实似乎试图加载所有事务而不是仅对事务集合执行COUNT查询.

任何人都可以向我解释原因吗?

附加:以下是EF模型对这两个类的看法

在此输入图像描述

更新:

感谢所有回复,我相信我出错的地方是认为附加到Approval对象的集合将作为IQueryable执行.我将不得不对dbContext对象执行计数.

感谢大家.

Dev*_*Dev 5

var aCnt = from a in dbContext.Approvals
    where a.id == id
    select a.Transactions.Count;
Run Code Online (Sandbox Code Playgroud)

EF自己编译查询,上面的查询将被编译为select count事务

不同的是,

count = Transactions.AsQueryable<Transaction>().Count(); 
count = Transactions.Count;
Run Code Online (Sandbox Code Playgroud)

这些将从事务中选择所有记录,然后计算计数


rom*_*oza 1

当您访问该a.Transactions属性时,您将加载事务列表(延迟加载)。如果你想获得Count唯一的,那么使用这样的东西:

dbContext.Transactions.Where(t => t.Approvals.Any(ap => ap.Id == a.Id)).Count();
Run Code Online (Sandbox Code Playgroud)

哪里a给予批准。