You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为带[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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:29:50