在实体框架中,如果我执行以下操作:
var count = myIQueryable.Count();
var list = myIQueryable.ToList();
这次击中数据库两次吗?或只是一次?
答案 0 :(得分:10)
为了有效地计算条目数,框架需要评估查询,从而命中数据库。但是,由于查询可能在Count()和ToList()之间发生了变化,因此必须再次进行评估。请考虑以下事项:
var myIQueryable = my.db<SomeModel>(); // IQueryable<SomeModel>
var countQuery = myIQueryable.Count(); // 10
MakeAdditions(myIQueryable, 10); // adds 10 items
var list = myIQueryable.ToList(); // List<SomeModel> count=20
MakeAdditions(myIQueryable, 10);
var countList = list.Count(); // still 20, List never changed
换句话说,针对IQueryable的所有调用仍然受其运行查询的方式的影响。在将查询捕获到List中之后,您将专门处理内存中的List,与IQueryable的数据源发生的更改无关。
答案 1 :(得分:6)
是的,它确实击中了数据库两次,因为急切地评估了Count
和ToList
。如果您只想访问一次,请执行以下操作:
var list = myIQueryable.ToList();
var count = list.Count;