C#IEnumerable与IQueryable的区别

本文分析了.NET中IEnumerable在内存中过滤和IQueryable在服务器端过滤的区别,强调了IQueryable的延迟执行特性,指出在大数据量查询时IQueryable更具优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通集合的(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的时候才会执行查询操作

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值