运算符'!='不能应用于'bool'类型的操作数?和'int'

时间:2013-09-03 11:12:50

标签: c# linq

当我尝试在Linq Pad中运行查询时出现上述错误,如下所示,

var qry = (from i in INTERNETDATAs 
join c in COVERS on Convert.ToInt32(i.COVERTYPE) equals c.COV_TYPE
where  i.DATELOADED >= new DateTime(2013,7,1)
&& i.DATELOADED < new DateTime(2013,8,1)
&& i.CAMPAIGNTYPE == "4"
&& c.COVERTYPEID == 17063789
&& c.CHILDAPPLIES  != 1
&& c.SPOUSEAPPLIES != 1
select i
);

qry.Dump();

我的COVERS表中的c.CHILDAPPLIES和c.SPOUSEAPPLIES列是(bit,null)类型。

我的Sql查询工作正常,如下所示,但我的LINQ查询错误运算符'!='不能应用于'bool?'类型的操作数和'int'

SELECT Count(*) 
    FROM INTERNETDATA I Join COVERS C ON  C.COV_TYPE = CONVERT(int, I.COVERTYPE) 
    WHERE ((I.DATELOADED >= CONVERT(DATETIME, '1 Jul 2013 00:00:00')) 
    AND (I.DATELOADED < CONVERT(DATETIME, '1 Aug 2013 00:00:00'))) 
    AND (CONVERT(int, I.COVERTYPE) = C.COV_TYPE)
    AND (C.COVERTYPEID = 17063789)
    AND (I.CAMPAIGNTYPE = 4) 
    AND C.CHILDAPPLIES != 1
    AND C.SPOUSEAPPLIES !=1

提前致谢。

5 个答案:

答案 0 :(得分:9)

我怀疑你只是想要:

&& !c.CHILDAPPLIES
&& !c.SPOUSEAPPLIES

...虽然你应该考虑是否要匹配列为NULL而不是true或false的行。如果上面没有编译(可能没有),你可以使用null-coalescing运算符有效地提供“default”值:

&& !(c.CHILDAPPLIES ?? true)
&& !(c.SPOUSEAPPLIES ?? true)

&& !(c.CHILDAPPLIES ?? false)
&& !(c.SPOUSEAPPLIES ?? false)

问题是在LINQ映射中,它们不是“0或1”值 - 它们是“真或假”值(或为空) - 因此您无法将它们与整数进行比较。

答案 1 :(得分:2)

尝试以下我认为这就是你想要的

var qry = (from i in INTERNETDATAs 
join c in COVERS on Convert.ToInt32(i.COVERTYPE) equals c.COV_TYPE
where  i.DATELOADED >= new DateTime(2013,7,1)
&& i.DATELOADED < new DateTime(2013,8,1)
&& i.CAMPAIGNTYPE == "4"
&& c.COVERTYPEID == 17063789
&& c.CHILDAPPLIES  != true
&& c.SPOUSEAPPLIES != true
select i
);

qry.Dump();

答案 2 :(得分:1)

我建议这是其中之一:

&& c.CHILDAPPLIES  != 1
&& c.SPOUSEAPPLIES != 1

即使它们的类型为Bit,linq也会将它们作为布尔值

进行比较

答案 3 :(得分:1)

如果它返回bool?你不能把它与真或假比较吗?

答案 4 :(得分:0)

而不是使用'!='运算符来查看它,使用

!c.CHILDAPPLIES && !c.SPOUSEAPPLIES.

这可能会有帮助