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

如何在.NET Maui的SQLite表类定义中创建计算列?

在.NET Maui SQLite中实现计算列

针对你的需求,有两种可行的实现方式,需根据场景选择:

1. 内存计算属性(推荐,适配关联字段计算)

你的计算公式依赖关联表cl_Items的ItemSize字段,无法直接通过数据库生成列实现,优先采用内存只读属性方案:

在cl_ItemHist类中添加只读属性,直接在内存中计算结果,同时用[Ignore]标记让SQLite-net ORM忽略该属性,避免在数据库中创建对应列:

[SQLite.Table("ItemHist")]
public class cl_ItemHist : TableData
{
    // 现有字段和关联属性保持不变...

    // 计算列:单位价格 = TotalPrice / (ItemSize的数值字段 * ItemQty)
    // 注意:请将ItemSize.Size替换为cl_Items类中实际存储尺寸的字段名(比如float Size)
    [Ignore]
    public float UnitPrice 
    { 
        get 
        {
            // 避免除以零的运行时异常,添加判断逻辑
            if (ItemSize?.Size == 0 || ItemQty == 0)
                return 0;
            return TotalPrice / (ItemSize.Size * ItemQty);
        } 
    }
}

注意事项:

  • 确保关联对象已加载:你设置了[OneToOne(CascadeOperations = CascadeOperation.CascadeRead)],查询cl_ItemHist时会自动加载ItemSize;若使用懒加载,需手动包含关联数据。
  • 异常防护:必须添加除以零的判断,避免程序崩溃。

2. 数据库生成列(仅适用于当前表字段计算)

如果计算公式仅依赖cl_ItemHist自身字段(不涉及关联表),可使用SQLite的生成列(需SQLite 3.31.0及以上版本支持)。但你的需求涉及跨表字段,此方式无法直接实现,仅作补充说明:

[SQLite.Table("ItemHist")]
public class cl_ItemHist : TableData
{
    // 现有字段...

    // 示例:基于当前表字段的计算列(如TotalPrice / ItemQty)
    [Column("UnitPrice", TypeName = "FLOAT GENERATED ALWAYS AS (TotalPrice / ItemQty) VIRTUAL")]
    [ReadOnly]
    public float UnitPrice { get; set; }
}

限制:

  • 生成列只能引用当前表字段,无法跨表关联查询。
  • 需确认项目使用的SQLite版本符合要求(.NET Maui默认版本通常满足)。

内容的提问来源于stack exchange,提问作者mfmimages

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 06:17:39