SQLSugar中Includes和Mapper的区别
在SQLSugar中,Includes
和Mapper
确实在处理过滤器方面有一些不同的行为。
Includes
方法:当你使用Includes
方法来加载关联实体时,SQLSugar会忽略过滤器,不会将过滤器应用于加载的关联实体。这意味着无论你是否定义了过滤器,使用Includes
方法加载的关联实体都会被加载,而不受过滤器的影响。
示例:
1 2 3 4 5 6 7 | // 假设有一个过滤器定义在Customer实体上 db.Filter<Customer>().Where(c => c.IsActive == true ); var order = db.Queryable<Order>() .Where(o => o.OrderId == orderId) .Includes(o => o.Customer) // 不受过滤器的影响,会加载所有的Customer .Single(); |
Mapper
方法:与Includes
方法不同,Mapper
方法会受到过滤器的影响。如果你在模型上定义了过滤器,然后使用Mapper
方法来映射查询结果到实体模型,过滤器会应用于加载的数据。这意味着只有符合过滤器条件的数据才会被加载到实体模型中。
示例:
1 2 3 4 5 6 7 | // 假设有一个过滤器定义在Customer实体上 db.Filter<Customer>().Where(c => c.IsActive == true ); var order = db.Queryable<Order>() .Where(o => o.OrderId == orderId) .Mapper(o => o.Customer, c => c.Id == orderId) // 受过滤器的影响,只加载符合条件的Customer .Single(); |
总之,要根据你的需求选择合适的方法。如果你希望加载所有关联实体而不受过滤器的影响,可以使用Include
方法。如果你希望受到过滤器的影响,只加载符合条件的数据,可以使用Mapper
方法,并在其中定义条件。
实测:
Includes和Mapper都会发送两条sql,先查出主表,然后再发送一条sql查询子表,在查询子表时Includes的sql不包含过滤器相关查询条件,而Mapper则包含过滤器相关的查询条件。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具