使用 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'

使用 LINQ 访问数据库,数据类型冲突

您错误地使用赋值运算符 (=) 代替相等运算符 (==)。

您的生产线

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。

你可能应该考虑获得FirstFirstOrDefaultSinleSingleOrDefault