SQLite.net如何根据Id仅查询单个列的字符串值?
问题:如何从SQLite查询单个列值而非完整模型对象?
我定义了这样的模型类:
public class LanguageText { [PrimaryKey] public int Id { get; set; } public string de { get; set; } public string en { get; set; } public string ru { get; set; } }
我想要根据Id仅查询单个列(比如de)的字符串内容,尝试了以下代码:
SQL = "SELECT [de] from [LanguageText] WHERE [Id] = \"1\"" var p = App.Database.QueryAsync<LanguageText>(SQL).Result.First();
但这段代码返回的是完整的LanguageText行对象,而我只想要de列的字符串值,请问该如何实现?
解决方案
别发愁,这是因为你用QueryAsync<LanguageText>时,ORM会自动把查询结果映射到LanguageText实例上——哪怕你只查了一列。这里有几种实用的解决办法:
方法一:直接提取目标属性
既然已经拿到了LanguageText对象,直接取它的de属性就行,简单直接:
string sql = "SELECT [de] from [LanguageText] WHERE [Id] = \"1\""; var deText = App.Database.QueryAsync<LanguageText>(sql).Result.First().de;
不过这种方式还是会创建完整的对象,只是最后只用到了一个属性,适合快速解决简单场景。
方法二:直接查询返回基础类型(更高效)
如果你不想创建LanguageText对象,可以直接让查询返回字符串类型,推荐用参数化查询避免SQL注入:
用ExecuteScalarAsync(适合单值查询)
如果确定只会返回一个值,ExecuteScalarAsync是最高效的选择:
var deText = App.Database.ExecuteScalarAsync<string>( "SELECT [de] from [LanguageText] WHERE [Id] = ?", 1 ).Result;
映射到极简自定义类
如果偶尔需要查询多列但又不想用完整模型,可以定义一个只包含目标列的小类:
// 定义仅包含需要列的类 public class LanguageDe { public string de { get; set; } } // 查询并映射到这个小类 var result = App.Database.QueryAsync<LanguageDe>( "SELECT [de] from [LanguageText] WHERE [Id] = ?", 1 ).Result.First(); var deText = result.de;
方法三:用LINQ投影(类型更安全)
如果你的ORM支持LINQ(比如Entity Framework Core),可以直接用LINQ来投影出需要的列,不用写原生SQL:
var deText = App.Database.LanguageTexts .Where(t => t.Id == 1) .Select(t => t.de) .FirstOrDefaultAsync() .Result;
这种方式类型安全,还能避免手写SQL的错误。
内容的提问来源于stack exchange,提问作者Nimral
相关产品推荐
相关产品推荐

