使用 LINQ 访问数据库,数据类型冲突
本文关键字:数据类型 冲突 数据库 LINQ 访问 使用 | 更新日期: 2023-09-27 18:31:33
我正在尝试使用 LINQ 访问数据库中的数据,但遇到了数据类型错误。
这是我的代码:
public static String GetCheckIfCsIsRunning()
{
using (Entities db = new Entities())
{
Stringl status = (from stat in db.Messenger_Settings
where stat.Id == 1
select stat.SettingValue);
return status;
}
}
我目前在
where stat.Id == 1
谚语
Cannot implicitly convert type 'int' to 'bool'
我正在尝试从我的表中选择行的 ID,但代码行说 Id 是 bool 类型?也许代码的"状态"变量将"stat"创建为布尔类型。但是我如何根据 Id 选择行?
我的表结构是
ID(整数) |名称(瓦尔查尔) |SettingValue(varchar)
编辑
我忘了添加一个额外的"="("="-->"==")
编辑-2
将 int 替换为布尔值的新错误发生 - 我想访问的数据是 varchar(选择统计。设置值)
Cannot implicitly convert type 'System.LINQ.IQueryable,string.' to 'string'
您错误地使用赋值运算符 (=) 代替相等运算符 (==)。
您的生产线
where stat.Id = 1
实际上将 1 分配给 stat.ID
,根本不是你想要的;然后,赋值返回分配的值,在本例中为 1。 由于 C# 不会隐式将int
转换为 bool
,因此会出现您看到的错误。 您要做的是改用相等运算符==
,它将执行您的期望:检查 stat 的值。Id 为 1,返回真或假。
此外,为了将来参考,您可以通过使用不同的编程习惯法来避免这样的意外赋值错误:将常量放在首位,即
1 = stat.Id
虽然您在这里仍然会收到错误,但在其他情况下,您执行意外分配,或者在将int
隐式转换为bool
的语言中(这将是难以跟踪的运行时错误),但您反而会收到错误,因为您无法为数字文本(如 1)赋值。
根据您的编辑,LINQ 始终返回"延迟加载"查询。 一旦您尝试访问该查询中的任何元素,它就会枚举它。 IQueryable 是该查询的对象表示形式。 由于我们知道查询表示 string
s(0 或更多)的序列,因此我们可以针对 IQueryable<string>
调用几个方法之一来获取结果:
-
.First()
将返回序列中的第一个元素,如果序列没有元素,则抛出。 -
.FirstOrDefault()
将返回序列中的第一个元素,如果序列不包含任何元素,则返回默认值。 - 如果序列中只有一个元素,
.Single()
将返回元素,否则将抛出(如果有零个或多个元素)。 - 如果序列中只有一个元素,
.SingleOrDefault()
将返回元素,如果没有元素,则返回默认值,如果有多个元素,则返回 throw。
选择哪一个取决于您的数据库架构以及应用程序的所需行为。 如果您知道一个设置只有一个且正好有一个值,请使用 .Single()
,以便您可以出错并检测是否得到多个结果。 如果某个设置可能有值(或者可能未定义),请使用 .SingleOrDefault()
。 如果一个设置在表中可以有多个值,请使用 .First()
或 .FirstOrDefault()
.
在任何情况下,在出现意外结果的情况下,您都会得到string
或运行时异常。
=
是一个赋值运算符。
您希望使用 ==
比较运算符比较两个值。
where stat.Id = 1
需要where stat.Id == 1
您正在尝试设置值,而不是进行比较。
我可以在这里看到两个问题。
首先,您尝试将字符串(varchar)传递给int。
其次,您拥有的 LINQ 将生成类似 IEnumerable 或 IQueryable 的东西,它们将无法进入 int。
你可能应该考虑获得First
、FirstOrDefault
、Sinle
、SingleOrDefault