-2

我正在尝试使用 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 类型?也许代码的“status”变量将“stat”创建为 bool 类型。但是我将如何根据 Id 选择行?

我的表结构是

ID(整数) | 名称(varchar) | 设置值(varchar)

编辑

我忘了添加一个额外的 '=' ('=' --> '==')

编辑-2

用 bool 替换 int 发生新错误 - 我要访问的数据是 varchar (select stat.SettingValue)

Cannot implicitly convert type 'System.LINQ.IQueryable,string.' to 'string'
4

4 回答 4

2

=是赋值运算符。

您想使用==比较运算符比较两个值。

于 2013-09-16T17:05:51.927 回答
2

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

你的线

where stat.Id = 1

实际上1 分配给stat.ID,而不是您想要的;然后,赋值返回所分配的值,在本例中为 1。由于 C# 不会隐式将 an 转换intbool,因此您会看到您看到的错误。您想要做的是改用==相等运算符,它会执行您期望的操作:检查 stat.Id 的值是否为 1 并返回 true 或 false。

此外,为了将来参考,您可以通过使用不同的编程习惯来避免这样的意外赋值错误:将常量放在第一位,即

1 = stat.Id

虽然在这里您仍然会遇到错误,但在其他情况下您执行意外分配,或者在隐式转换int为的语言bool(这将是一个难以追踪的运行时错误)中,您将得到一个错误,因为您不能为像 1 这样的数字文字赋值。


根据您的编辑,LINQ 始终返回“延迟加载”查询。只要您尝试访问该查询中的任何元素,它就会枚举它。IQueryable是该查询的对象表示。由于我们知道查询表示strings 的序列(0 或更多),我们可以调用几个方法之一IQueryable<string>来获取结果:

  • .First()将返回序列中的第一个元素,如果序列没有元素则抛出。
  • .FirstOrDefault()将返回序列中的第一个元素,如果序列不包含任何元素,则返回默认值。
  • .Single()如果序列中只有一个元素,则返回该元素,否则抛出(如果有零个或多个元素)。
  • .SingleOrDefault()如果序列中只有一个元素,则返回该元素,如果没有元素,则返回默认值,如果有多个元素,则抛出。

选择哪一个取决于您的数据库架构以及应用程序所需的行为。如果您知道某个设置只会有一个且只有一个值,请使用.Single(),以便您可以出错并检测是否获得多个结果。如果设置可能有值(或者可能未定义),请使用.SingleOrDefault(). 如果一个设置在表中可能有多个值,请使用.First().FirstOrDefault()

无论如何,在出现意外结果的情况下,您将得到一个string或运行时异常。

于 2013-09-16T17:06:19.730 回答
1

我可以在这里看到两个问题。

首先,您试图将字符串 (varchar) 传递给 int。

其次,您拥有的 LINQ 将产生类似 IEnumerable 或 IQueryable 之类的东西,它们将无法进入 int。

您可能应该考虑获得First, FirstOrDefault, Sinle,SingleOrDefault

于 2013-09-16T17:05:52.327 回答
1

where stat.Id = 1需要是where stat.Id == 1

您正在尝试设置值而不是进行比较。

于 2013-09-16T17:06:05.370 回答