.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
相关产品推荐
相关产品推荐

