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

.NET 8 MAUI中如何将SQLite查询结果映射为自定义对象?

解决.NET 8 MAUI中SQLite查询结果映射到自定义对象的问题

问题根源

你用ExecuteScalarAsync<WordStat>报错是因为该方法的设计目的是获取单个标量值(如整数、字符串等),而非映射复杂的自定义实体对象,所以SQLite无法识别如何将查询结果转换为WordStat类型。

正确实现方式

根据你使用的SQLite库类型,分两种场景处理:

场景1:使用sqlite-net-pcl(SQLiteAsyncConnection,MAUI中常用)

这个库支持自动将查询结果映射到实体类,只需使用正确的查询方法:

获取结果列表

// 假设你的SQLite异步连接实例为_sqliteAsyncConnection
var sql = @"SELECT 
    ifnull(ws.cnt, 0) AS Impression, 
    ifnull(ws.cntRight, 0) AS Rights, 
    DictionaryId, Language, OriginalWord, 
    TranslateWords, WordType 
FROM 
    Words w 
LEFT JOIN 
    (SELECT 
         WordId, COUNT(*) AS cnt, 
         SUM(RightAnswer) AS cntRight 
     FROM 
         WordStatistic 
     GROUP BY 
         WordId) AS ws ON w.ID = ws.WordId
WHERE 
    DictionaryId = 1
ORDER BY 
    Impression, Rights";

// 执行查询并映射为WordStat列表
List<WordStat> wordStats = await _sqliteAsyncConnection.QueryAsync<WordStat>(sql);

获取单个结果

如果只需要查询结果中的第一条数据:

WordStat? singleWordStat = await _sqliteAsyncConnection.QueryFirstOrDefaultAsync<WordStat>(sql);

注意事项:

  • 确保你的WordStat类有无参数构造函数(你的代码已经满足)。
  • SQL查询的列名(包括别名)要和WordStat的属性名完全匹配(你的SQL别名已经和属性名对应,无需修改)。

场景2:使用Microsoft.Data.Sqlite(官方原生库)

该库不支持自动实体映射,需要手动通过SqliteDataReader读取并赋值:

using var connection = new SqliteConnection("你的SQLite连接字符串");
await connection.OpenAsync();

using var command = new SqliteCommand(sql, connection);
using var reader = await command.ExecuteReaderAsync();

List<WordStat> wordStats = new();
while (await reader.ReadAsync())
{
    var wordStat = new WordStat
    {
        Impression = reader.GetInt32(reader.GetOrdinal("Impression")),
        Rights = reader.GetInt32(reader.GetOrdinal("Rights")),
        DictionaryId = reader.GetInt64(reader.GetOrdinal("DictionaryId")),
        Language = reader.GetInt32(reader.GetOrdinal("Language")),
        OriginalWord = reader.GetString(reader.GetOrdinal("OriginalWord")),
        TranslateWords = reader.GetString(reader.GetOrdinal("TranslateWords")),
        WordType = reader.GetInt32(reader.GetOrdinal("WordType"))
    };
    wordStats.Add(wordStat);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 10:33:14