如果DB字段包含数据,则返回布尔值

时间:2012-01-22 13:05:05

标签: c# linq linq-to-sql

我有一个包含布尔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?

我错过了什么? 感谢。

3 个答案:

答案 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;}