普通集合的(IEnumerable)版本是在内存中进行数据过滤(客户端评估);
IQueryable版本则是把查询操作翻译为SQL语句,在数据库服务器端进行数据过滤(服务器端评估)
而通常情况服务器端评估性能会更高,下面通过生成SQL语句来更直观的了解一下两者区别
一、通过各自生成的Sql语句来对比其中差异
IEnumerable及生成的查询Sql语句
using (MyDbContext ctx = new MyDbContext())
{
IEnumerable<Delivery> deliveries = ctx.Deliveries;
IEnumerable<Delivery> items = deliveries.Where(o => o.CompanyName.Contains("city"));
foreach (var i in items)
{
Console.WriteLine(i.CompanyName + i.Number);
}
}
IQueryable及生成的查询Sql语句
using(MyDbContext ctx = new MyDbContext())
{
IQueryable<Delivery> items = ctx.Deliveries.Where(d => d.CompanyName.Contains("city"));
foreach (var i in items)
{
Console.WriteLine(i.CompanyName + i.Number);
}
}
通过以上生成的Sql语句,我们可以看出IQueryable所生成的Sql语句是有过滤条件like的,而IEnumerable是取整表数据。
因此在查询表数据量大时,选择IQueryable会更加具有优势。
二、IQueryable的另一个特点——延迟执行
IQueryable只是代表一个“可以放到数据库服务器去执行的查询”,他没有立即执行,仅仅是“可以被执行”
Console.WriteLine("准备where");
IQueryable<Delivery> items = ctx.Deliveries.Where(d => d.CompanyName.Contains("city"));
Console.WriteLine("准备foreach");
foreach (var i in items) { }
Console.WriteLine("结束");
输出结果:
结论:只有遍历IQueryable的时候才会执行查询操作