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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:27:36