我正在尝试使用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'
答案 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。
您应该考虑获取First
,FirstOrDefault
,Sinle
,SingleOrDefault
答案 3 :(得分:1)
where stat.Id = 1
必须为where stat.Id == 1
您正在尝试设置值而不是进行比较。