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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:51:37