OrmLite多表关联+自定义列查询结果如何映射到POCO无需逐列指定字段
方案1:使用[CompositeResult]特性(推荐,几乎无修改成本)
你当前使用的是ServiceStack OrmLite框架,它原生支持嵌套类的结果自动映射,只需要给你的POCO类加上[CompositeResult]特性即可:
using ServiceStack.OrmLite; [CompositeResult] public class BlogImportExportIntermediate { public Blog Blog { get; set; } public UserAuthCustom UserAuthCustom { get; set; } public BloggerProfile BloggerProfile { get; set; } private string _blogCategroiesJson { get; set; } public string BlogCategroiesJson { get => _blogCategroiesJson; set { _blogCategroiesJson = value; BlogCategories = PostgreSqlMethods.FromJson<List<BlogCategory>>(value); } } public List<BlogCategory> BlogCategories { get; set; } }
加完特性后直接使用你原来的查询语句即可,ORM会自动将对应表的整行数据映射到嵌套的实体属性上:
var results = db.Select<BlogImportExportIntermediate>(q);
这个方案完全不需要修改现有查询逻辑,性能和原生映射一致,完全适配大数据量导出场景。
方案2:动态结果手动映射(兼容所有版本,灵活性最高)
如果你使用的OrmLite版本不支持[CompositeResult]特性,可以先查询动态结果,再手动组装成目标POCO,转换开销极低,不会影响大数据量查询效率:
var dynamicResults = db.Select<dynamic>(q); var results = new List<BlogImportExportIntermediate>(); foreach (var row in dynamicResults) { results.Add(new BlogImportExportIntermediate { Blog = row.ConvertTo<Blog>(), UserAuthCustom = row.ConvertTo<UserAuthCustom>(), BloggerProfile = row.ConvertTo<BloggerProfile>(), BlogCategroiesJson = row.BlogCategroiesJson }); }
OrmLite内置的ConvertTo扩展方法会自动匹配列名和实体属性,不需要你手动指定任何字段。
内容的提问来源于stack exchange,提问作者Guerrilla
相关产品推荐
相关产品推荐

