我有下面的linq查询,它接受一个文本字段,可能是Y,N或DBnull并填充一个布尔值?参数,无论是True,False还是null,具体取决于字段的值。
var dset = from i in tbdc.Talkbacks
where i.talkback_id == id
select new Talkback(
i.talkback_id, i.acad_period, i.reference,
i.staff_member, i.date_received, i.no_talkers,
i.gender_id, i.names, i.type_id,
i.method_id, i.area_id, i.site_id,
i.category_id, i.date_closed, i.expenddate,
i.acknowledgementtarget,
(i.targetmet == "Y") ? true :
((i.targetmet == "N") ? false : null),
(i.acknowledgementtargetmet != "N") ? true : false
有问题的一行是
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? false : null)
在阅读之后,我发现了一些文档,说明内联的第二个和第三个参数需要是相同的类型,或者可以隐式地相互转换。
我的问题是,如何解决这个限制以达到我想要的结果?
我对C#比较新,所以我还不熟悉它的所有怪癖/功能。
答案 0 :(得分:6)
我的建议是将其替换为:
(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
编译器在没有强制转换的情况下不同意的原因是,即使将其存储为可空结构,三元操作也会检查结果是否通过隐式转换兼容。
结果true
和false
被视为bool
文字,而不是bool?
,因此无法隐式转换为null
。将结果投射到bool?
将使它们具有可比性。我建议的那个在bool?
和null
之间隐式转换,这也有效:
(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;
这是bool
和bool?
之间的隐式转换。我随意选择第一个..
答案 1 :(得分:2)
您可以将一个或多个表达式显式转换为bool?
:
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)