记录一些EntityFramework中的使用技巧,不定期更新。
- 日志记录及拦截
- IQueryable
与 IEnumerable 与延迟加载
日志记录及拦截
EntityFramework作用是ORM,那么最终它是需要和数据库打交道的,就一定少不了SQL语句。如何知道EntityFramework生成的sql语句是怎样的呢?
通过设置DbContext
属性设置为采用字符串的任何方法的委托(DbContext.Database.Log=Console.Write
)
1 | Console.WriteLine("from db, get blogs....."); |
比如上面的代码,会将生成的查询语句记录到Console控制台中,如下图:
如果需要将日志记录至其他位置,则可以使用其他日志框架,并且定义一个日志记录方法:
1 | //定义日志访问类及方法 |
设置自己的记录日志格式:
1 | public class OneLineFormatter : DatabaseLogFormatter |
IQueryable 与 IEnumerable与延迟加载
简单总结:IQueryable
所有数据加载至内存中,再进行Where、OrderBy等操作。同时,IEnumerable不仅仅针对数据库数据操作,可以是数组、List等。
- Enumerable类,对继承了IEnumerable
接口的集合进行扩展; - Queryable类,针对继承了IQueryable
接口的集合进行扩展。 - DbSet
实现了IQueryable 、IEnumerable 接口。通过两个静态类对DbSet 进行扩展操作,这两个类对实现了IQueryable 、IEnumerable 接口的集合进行了很多方法的扩展(All,Any, Average,Where等)
Enumerable类中Where方法定义。
1 | public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate); |
Queryable类中Where方法定义,
1 | public static IQueryable<TSource> Where<TSource>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate); |
IQueryable接口会把查询表达式先缓存到表达式树中,只有当真正遍历发生的时候,才会由IQueryProvider解析表达式树,生成sql语句执行数据库查询操作。
- 本文作者: 达文西
- 本文链接: https://edsiongithub.github.io/2021/11/04/21/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!