IQueryable对象的多次评估是否多次访问数据库?

时间:2011-06-09 15:04:46

标签: c# entity-framework

在实体框架中,如果我执行以下操作:

var count = myIQueryable.Count();
var list = myIQueryable.ToList();

这次击中数据库两次吗?或只是一次?

2 个答案:

答案 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)

是的,它确实击中了数据库两次,因为急切地评估了CountToList。如果您只想访问一次,请执行以下操作:

var list = myIQueryable.ToList();
var count = list.Count;