使用EF Core7.0+Pomelo7.0执行MySQL原生SQL报't.Value'列不存在错误
解决方案:EF Core 7.0 + Pomelo 7.0 执行原生SQL报Unknown column 't.Value'错误
问题原因
EF Core 7.0对Database.SqlQuery<T>处理值类型(如int)的逻辑做了调整,默认期望查询结果的列名为Value,但你的SQL返回的列别名是CNT,再加上Pomelo MySQL驱动的适配细节,导致生成的查询语句包含t.Value,最终数据库找不到该列报错。
可行解决方案
方案1:修改SQL列别名为Value
直接将查询结果的别名改为EF Core 7.0期望的Value,MySQL中用反引号包裹标识符避免关键字冲突:
var cnt = context.Database.SqlQuery<int>($"SELECT COUNT(*) AS `Value` FROM TABLE").FirstOrDefault();
方案2:用自定义实体/记录类配合FromSqlRaw
定义简单的类或记录接收查询结果,通过Set<T>().FromSqlRaw执行查询:
// 定义接收结果的类(或用C# 9+记录类型简化) public class CountResult { public int CNT { get; set; } } // 执行查询 var cnt = context.Set<CountResult>().FromSqlRaw($"SELECT COUNT(*) AS CNT FROM TABLE").FirstOrDefault()?.CNT ?? 0;
方案3:使用ExecuteScalar直接获取标量值
如果仅需单个标量结果,推荐用ExecuteScalar绕开实体映射逻辑,更高效:
var cnt = context.Database.ExecuteScalar<int>($"SELECT COUNT(*) FROM TABLE");
内容的提问来源于stack exchange,提问作者viscroad
相关产品推荐
相关产品推荐

