我有下面的 linq 查询,它接受一个可能是 Y、N 或 DBnull 的文本字段并填充一个 bool 值?参数为 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# 比较陌生,所以还不熟悉它的所有怪癖/功能。
最佳答案
我的建议是将其替换为:
(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
编译器在没有转换的情况下不同意的原因是,即使您将其存储到可空结构中,三元运算也会通过隐式转换检查结果是否兼容。
结果 true
和 false
被视为 bool
文字,而不是 bool?
,因此不能隐式转换为空
。将任一结果转换为 bool?
将使它们具有可比性。我建议的那个在 bool?
和 null
之间有一个隐式转换,这也有效:
(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;
哪个是 bool
和 bool?
之间的隐式转换。我更喜欢第一个..
关于C# 使用 LINQ 和 Nullable Boolean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3182374/