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

