2012-01-22 73 views
2

我有一个对象模型,其中包含一个布尔MyBool和我有一个表包含一个字段MyField。我正在写一个linq-to-sql查询,它应该返回MyBool设置为true或false的对象列表,具体取决于MyField是否有值。返回一个布尔值,如果一个数据库字段包含数据

这是我到目前为止有:

var TheListOfObjects = (from thetable in MyDC.TheTable 
         .... 
         select new MyObject() 
         { 
          MyBool = thetable.MyField.Contains("*") 

         }).ToList(); 

我的错误:空值不能分配给具有类型System.Boolean的成员这是一个非空的值类型。不包含返回一个布尔?

我错过了什么? 谢谢。

+0

我不知道关于LINQ舔,但SQL语法是EXISTS关键字.. 。如果存在(SELECT 1 FROM table)BEGIN。再加上你的Google努力可能会让你更进一步。 –

回答

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(); 
+0

好吧,这也会工作:MyBool =(thetable.MyField == null)?假:真 – frenchie

+0

这将工作,但你可以进一步浓缩'MyBool =(thetable.MyField == null)' – Jason

1

你需要让你的布尔变量可空,以便它可以接受bool? MyBool {get;set;}

+0

我知道这会解决它,但我正在寻找保持对象模型,而不是改变查询。 – frenchie

2

哈里斯·哈桑通过DB

变化bool MyBool {get;set;}可能返回空值是正确的。为了真正了解这个问题,想想SQL C#代码可能会变成:

(CHARINDEX(MyField, '*', 1) - 1) 

但如果MyField的为null,该表达式变成空本身!

Linq2Sql不保证C#的语义!它提供了C#语义的一个很好的近似,但它接近于SQL模型。

您可以通过说

MyBool = (bool?)thetable.MyField.Contains("*") ?? false 

或修复此说

MyBool = thetable.MyField != null && thetable.MyField.Contains("*") 

你也可以将MyBool可空,但是这可能是不是你indend什么。

顺便说一下,当你做一个“失败”的左连接时,你会得到同样的奇怪行为,因为SQL会用NULL填充连接的行。

+0

好吧,我明白了;这也会工作:MyBool =(thetable.MyField == null)?假:真 – frenchie

+0

它会,虽然它有点笨拙。 – usr

相关问题