EFcore2.2 某些where会导致EF把数据全查出来再内存中过滤分页
今天碰到一个奇怪问题,IQueryable对象拼接了某些where后,监控生成的sql里并不带任何where条件,导致数据全查出来再内存中过滤以及分页,查询时间非常慢。
具体where是这样的
Where(o => (o.StartTime - now).TotalSeconds <= 60 * 60 * 24)
这个EF没法转换成sql,所以导致全查出来再内存中过滤
改成这样就可以
Where(o => now.AddHours(24) > o.StartTime)
另外一些orderby 字段,如果不是数据库字段,而是计算字段,也会导致全查,然后再内存分页,例如你再实体中定义了这个计算属性, 用这个属性做排序会导致全查再内存中排序,如果数据量很大,会有很严重的性能问题。
public int InactiveSort { get { switch (Status) { case ShiftStatus.CheckedOut: return 10; default: return 20; } } }
EF core 3.1后就不允许这样做了,这种查询执行时会抛异常了