如何在.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
相关产品推荐
相关产品推荐

