Xamarin C#中如何用SQLite的SELECT语句对列中大于0的值求和?
解决Xamarin中SQLite SUM查询返回类型问题
嘿,我来帮你搞定这个问题!你遇到的问题其实很常见——用conn.Query<Transaction>()执行SUM语句时,返回的是一个集合对象,而不是你想要的单一数值,所以直接调用ToString()才会输出类似System.Collections...的类型名称,而不是求和结果。
问题根源
Query<T>()方法的设计是用来返回符合T类型的实体列表,而SUM(price)返回的只是一个单一的数值,并不是完整的Transaction对象,所以这个方法并不适合用来获取聚合函数的结果。
两种解决方案
方案1:使用ExecuteScalar(推荐)
ExecuteScalar是专门用来执行返回单一值的SQL语句的,比如SUM、COUNT、AVG这类聚合查询,完美匹配你的需求:
// 根据price的实际类型调整泛型参数,比如int/decimal/double var totalPrice = conn.ExecuteScalar<decimal>("SELECT SUM(price) FROM Transaction WHERE price > 0"); entLabel.Text = totalPrice.ToString();
方案2:用自定义类接收查询结果
如果你坚持想用Query方法,需要定义一个简单的类来接收SUM的结果(因为Query需要映射到一个对象):
// 先定义一个用来接收求和结果的类 public class PriceSumResult { public decimal TotalPrice { get; set; } } // 执行查询并处理结果 var sumResult = conn.Query<PriceSumResult>("SELECT SUM(price) AS TotalPrice FROM Transaction WHERE price > 0"); if (sumResult != null && sumResult.Any()) { entLabel.Text = sumResult.First().TotalPrice.ToString(); }
这里要注意给SUM的结果起别名AS TotalPrice,确保和自定义类的属性名一致,这样SQLite才能正确映射。
对比你原来的Linq写法
你之前的Linq代码ent.Sum(t => t.price)之所以能直接得到数值,是因为Linq的Sum方法会遍历集合并计算总和,最终返回单一数值,而不是集合对象,所以可以直接转成字符串。
内容的提问来源于stack exchange,提问作者giacom0c
相关产品推荐
相关产品推荐

