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

Xamarin Forms中SQLite列值求和问题求助

解决Xamarin Forms中SQLite计算列总和的问题

嘿,作为也刚从Xamarin Forms+SQLite的坑里爬出来的新手,太懂你这种算总和出问题的崩溃感了!咱们一步步拆解你的三个尝试,然后给你靠谱的解决办法~

先分析你遇到的三个问题

1. Query方法返回奇怪字符串

你用conn.Query<tblAccount>()执行SUM查询,但Query<T>是用来返回完整实体对象列表的,而你的SQL语句返回的是一个单一的聚合值(SUM的结果),不是完整的tblAccount对象,所以ToList后拿到的是不符合预期的对象,自然会显示奇怪的字符串。这种场景应该用获取单一值的方法,而不是Query。

2. Where+Sum结果不符合预期

这个方法的问题大概率是过滤条件不全——你第一个方法里有日期范围ac_date between ? and ?,但第二个方法里只过滤了ac_incomeOrExpense,没加日期限制!另外还要检查ac_income的类型:如果你的实体类里这个属性是字符串类型,或者数据库里对应的列是文本类型,Sum的时候会出大问题(比如把字符的ASCII码加起来),必须是数值类型(int/decimal)。

3. 直接Sum得到87

这个结果明显不对,要么是你数据库里还有其他你没注意到的记录,要么就是刚才说的类型问题(比如ac_income是字符串,Sum时计算了字符编码的总和)。建议先排查数据库里的实际数据。

正确的解决办法

首先先确保你的实体类属性类型正确,比如:

public class tblAccount
{
    // 其他属性(比如主键等)
    public int ac_income { get; set; } // 或者decimal,根据你的需求选数值类型
    public string ac_incomeOrExpense { get; set; }
    public DateTime ac_date { get; set; }
}

方法一:用Table查询+完整过滤条件的Sum

把日期范围加回去,确保过滤条件和你第一个方法一致:

// 注意处理日期的时间部分,如果ac_date包含时间,建议用.Date来匹配
var totalSum = conn.Table<tblAccount>()
                  .Where(u => u.ac_incomeOrExpense == "income" 
                          && u.ac_date.Date >= dpIncomeFrom.Date 
                          && u.ac_date.Date <= dpIncomeTo.Date)
                  .Sum(a => a.ac_income);

方法二:用ExecuteScalar直接执行SQL聚合查询

这种方式更适合单一聚合值的查询,直接返回数值,避免实体类不匹配的问题:

// 指定返回类型为你需要的数值类型(int/decimal)
var totalSum = conn.ExecuteScalar<int>(
    "SELECT SUM(ac_income) FROM tblAccount WHERE ac_date BETWEEN ? AND ? AND ac_incomeOrExpense = ?",
    dpIncomeFrom.Date, dpIncomeTo.Date, "income");

额外排查步骤

如果还是不对,先确认符合条件的记录到底有哪些:

var matchedRecords = conn.Table<tblAccount>()
                        .Where(u => u.ac_incomeOrExpense == "income" 
                                && u.ac_date.Date >= dpIncomeFrom.Date 
                                && u.ac_date.Date <= dpIncomeTo.Date)
                        .ToList();

// 打印每条记录的ac_income值,看看是不是你预期的20和5
foreach(var record in matchedRecords)
{
    System.Diagnostics.Debug.WriteLine($"当前记录收入:{record.ac_income}");
}

这样就能清楚看到是不是过滤条件没生效,或者数据本身有问题啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:26:13