Entity FrameWork IEnumerable和IQueryable 导致全量查询问题

博主分享关于EF的笔记,讲述在看C#.NET MVC5书籍时,未关注IEnumerable和IQueryable,按书中例子操作,在数据量大时出现问题。经分析,错误写法导致整表扫描取数据,正确做法应在使用时才真正查询数据库。

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

Entity FrameWork IEnumerable和IQueryable 导致全量查询问题

引言

以前用.net写的东西,关于EF的坑因为不了解所以让我很难受,这算是把笔记搬过来了。
用EF的感觉我很喜欢,因为我确实更喜欢手写sql语句,Linq的语法更让我舒服,这就像是在用Java开发时我喜欢用mybatis而讨厌使用hibernate

IEnumerable和IQueryable

我在看一本老外写的c# .net mvc5的书的时候,当时关注的是项目整体的设计过程和模式,其余的重点在Razor,Ninject之类的东西,没有关注EF这个玩意,因为我当时想的是ORM框架都差不多,它的栗子是这么写的:

    public class EFDbContext : DbContext
    {
        public DbSet<Entities.Config> Configs { get; set; }
        public DbSet<Entities.Infomation> Infomations { get; set; }
    }

    public class EFConfigsRepository
    {
        public EFConfigsRepository() {
            context = new EFDbContext();
        }
        private EFDbContext context;
        public IEnumerable<Entities.Config> Configs
        {
            get {
                return context.Configs;
            }
        }
    }

然后我傻傻的就跟着做,然后发现数据量大的情况下,查询速度开始变的非常慢,我确信我的sql语句和索引没有任何问题
无奈打开sql的分析工具,跟踪每一条执行语句,因为我当时网上找的EF打印SQL语句的方法一个都没用,最后虽然用到了dbContext.Database.Log = s => System.Diagnostics.Trace.WriteLine(s.ToString());

原因分析

EFConfigsRepository写的时候,我直接按照它的例子写成了IEnumerable,这导致了在Linq语法被分析成SQL语句之前,这段查询已经被执行了(select * from xxxx),这就导致实际上Linq的语句并没有被解释成SQL语句,而是整表扫描取了整表的数据,之后的Linq语法实际就是在内存中对c#原生的对象在操作

正确做法应该是IQueryable,在Linq的最后使用ToList才去真正查询数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没事干写博客玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值