我有一个包含布尔MyBool的对象模型,我有一个包含字段MyField的表。我正在编写一个linq-to-sql查询,它应该返回一个MyBool设置为true或false的对象列表,具体取决于MyField是否有值。
这是我到目前为止所做的:
var TheListOfObjects = (from thetable in MyDC.TheTable
....
select new MyObject()
{
MyBool = thetable.MyField.Contains("*")
}).ToList();
我的错误:无法将null值分配给System.Boolean类型的成员,该类型是非可空值类型。不包含返回bool?
我错过了什么? 感谢。
答案 0 :(得分:2)
Haris Hasan是对的。为了真正理解这个问题,请考虑您的C#代码可能变成什么SQL:
(CHARINDEX(MyField, '*', 1) - 1)
但是如果MyField为null,则此表达式本身变为null!
Linq2Sql不保证C#语义!它提供了C#语义的良好近似,但它接近于SQL模型。
你可以通过说
来解决这个问题MyBool = (bool?)thetable.MyField.Contains("*") ?? false
或者说
MyBool = thetable.MyField != null && thetable.MyField.Contains("*")
你也可以使MyBool可以为空,但这可能不是你想要的。
顺便说一句,当你执行“失败”的左连接时,你会得到同样的奇怪行为,因为SQL会用NULL填充连接的行。
答案 1 :(得分:2)
如果您不想在MyObject中使用可为空的属性,则可以在分配时检查空值
var TheListOfObjects = (from thetable in MyDC.TheTable
....
select new MyObject()
{
MyBool = (thetable.MyField == null) ? false : thetable.MyField.Contains("*") //check if it's null in-line
}).ToList();
答案 2 :(得分:1)
您需要使bool变量可以为空,以便它可以接受DB返回的可能空值
将bool MyBool {get;set;}
更改为bool? MyBool {get;set;}