AutoQuery指定响应DTO时嵌套关联结果为空的问题咨询
问题原因
- AutoQuery 的
QueryDb<TSource, TDto>双泛型重载默认会直接将查询结果投影到 TDto 模型,SQL 查询阶段只会拉取 TDto 包含的基础字段,不会自动加载 TSource 实体上标记的[Reference]关联数据。 - 关联属性的加载逻辑依赖于 OrmLite 对查询目标类型的特性扫描:当你给 DTO(
BlogResponse)的集合属性加[Reference]时,OrmLite 会将 DTO 识别为数据表映射类,尝试查找BlogResponse对应的表结构和外键关联,而你的 DTO 并没有对应数据库表,自然就触发报错。 - 单泛型
QueryDb<TSource>重载默认会加载 TSource 上定义的所有[Reference]关联数据,所以返回结果的嵌套集合是正常填充的。
解决方案
不用自定义手动构造响应也可以实现需求,可选方案如下:
- 方案1(最稳妥,推荐):继续使用单泛型
QueryDb<Blog>定义请求,AutoQuery 会自动加载所有关联数据,返回前通过内置的.ConvertTo<T>()方法映射到 DTO 即可,就是你目前手动实现的逻辑,也可以直接在全局配置 AutoQuery 的自动映射逻辑,不用手写转换代码。 - 方案2:如果要保留
QueryDb<Blog, BlogResponse>双泛型定义,直接给请求类添加[UseLoadSelect]特性即可:
[UseLoadSelect] public class BlogsLookUpRequest : QueryDb<Blog, BlogResponse> { }
该特性会让 AutoQuery 先通过 LoadSelect 查询源表 Blog 的全量数据(包含所有标记的关联属性),再自动映射到 BlogResponse 模型,只要属性名匹配,嵌套的 BlogToBlogCategories 就会正常填充,不需要给 DTO 添加任何 ORM 相关特性。
内容的提问来源于stack exchange,提问作者Guerrilla
相关产品推荐
相关产品推荐

