如何为带[SQLite.Ignore]特性的Item类Order属性填充SQL查询结果?
解决SQLite中带
[SQLite.Ignore]特性的属性无法通过关联查询填充的问题 这问题我之前做项目的时候也碰到过,核心原因很明确:你给Item类的Order属性加了[SQLite.Ignore]特性,这会告诉SQLite ORM框架完全跳过这个属性的数据库映射逻辑——不管你的SQL查询里有没有返回Order列,ORM在把查询结果转成Item对象时都会直接忽略这个属性,自然就填充不上值了。
给你几个实用的解决办法,不需要移除[SQLite.Ignore]特性也能搞定:
方法1:匿名类中转手动映射
先把查询结果读到动态类型里,再手动把属性值赋值给Item对象,绕过ORM的忽略限制:
public List<Item> GetItems() { string sqlQuery = @" SELECT A.code, A.Name, B.Order FROM item A LEFT JOIN item_relations B ON B.ItemCode = A.code"; // 先查询到动态对象列表 var rawResults = db.DeferredQuery<dynamic>(sqlQuery).ToList(); // 手动映射到Item实体 return rawResults.Select(result => new Item { Code = result.code, Name = result.Name, Order = result.Order // 这里直接赋值,不受[SQLite.Ignore]影响 }).ToList(); }
这种方法的好处是简单直接,不用修改现有实体类;但如果Item的属性很多,手动映射会有点繁琐。
方法2:使用DTO(数据传输对象)中转
专门创建一个用于查询的DTO类,包含你需要的所有字段,查询完成后再转成Item实体:
// 新增一个查询专用的DTO类 public class ItemWithOrderDto { public string Code { get; set; } public string Name { get; set; } public string Order { get; set; } } public List<Item> GetItems() { string sqlQuery = @" SELECT A.code, A.Name, B.Order FROM item A LEFT JOIN item_relations B ON B.ItemCode = A.code"; // 先查询到DTO列表 var dtoList = db.DeferredQuery<ItemWithOrderDto>(sqlQuery).ToList(); // 映射到Item实体 return dtoList.Select(dto => new Item { Code = dto.Code, Name = dto.Name, Order = dto.Order }).ToList(); }
这种方法的优势是类型安全,IDE能提供智能提示,适合Item属性较多的场景;唯一的小缺点是需要额外维护一个DTO类。
补充说明
为什么你移除[SQLite.Ignore]就能正常填充?因为移除后ORM会把Order属性和数据库表的列关联起来,查询时会自动把SQL返回的Order列值赋值给属性。但你加这个特性肯定是有原因的(比如不想让这个属性被持久化到item表),所以上面两种方法更适合你的需求。
内容的提问来源于stack exchange,提问作者Branko
相关产品推荐
相关产品推荐

