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

时间:2013-09-16 17:03:55

标签: c# sql sql-server linq

我正在尝试使用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(int)|名称(varchar)| SettingValue(VARCHAR)

修改

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

EDIT-2

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

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

4 个答案:

答案 0 :(得分:2)

=是一个赋值运算符。

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

答案 1 :(得分:2)

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

你的行

where stat.Id = 1

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

此外,为了将来参考,您可以通过使用不同的编程习惯来避免这种意外分配错误:首先放置常量,即

1 = stat.Id

虽然您在此处仍然出现错误,但在其他情况下您会进行意外分配,或者隐式地将int转换为bool的语言(这将是一个难以追踪的运行时错误),您将得到一个错误,因为您无法将值分配给数字文字,如1。


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

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

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

在任何情况下,如果出现意外结果,您将获得string或运行时异常。

答案 2 :(得分:1)

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

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

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

您应该考虑获取FirstFirstOrDefaultSinleSingleOrDefault

答案 3 :(得分:1)

where stat.Id = 1必须为where stat.Id == 1

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