C#使用LINQ和可空布尔
我有下面的linq查询,它接受一个文本字段,可以是Y、N或DBnull,并填充一个布尔值?参数的值,根据字段的值设置为True、False或nullC#使用LINQ和可空布尔,c#,nullable,ternary-operator,implicit-conversion,C#,Nullable,Ternary Operator,Implicit Conversion,我有下面的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.sta
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)
在阅读之后,我发现了一些说明内联if的第二个和第三个参数必须是相同类型的,或者可以相互隐式转换的文档
我的问题是,我如何绕过这个限制来达到我想要的结果
我对C语言比较陌生,因此还不熟悉它的所有特性/功能。您可以将一个或多个表达式显式转换为
bool?
:
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)
我的建议是将其替换为:
(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
编译器不同意不使用强制转换的原因是,即使将其存储到可为null的结构中,三元操作也会通过隐式转换检查结果是否兼容
结果true
和false
被视为bool
文本,而不是bool?
,因此不能隐式转换为null
。将任一结果转换为bool?
将使它们具有可比性。我建议的方法是在bool?
和null
之间进行隐式转换,这也适用于:
(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;
这是
bool
和bool?
之间的隐式转换。我更喜欢第一个……它很有活力。我现在遇到了一个问题,我正在尝试使用DisplayTemplate中的值和下面的代码:其思想是,它将显示一个勾号图像表示true,交叉图像表示false,而没有图像表示undefined(尚未完成该代码)。我得到一个错误“当前上下文中不存在名称'True'。这个标记看起来像ASP.NET,我最近经常使用它。所以在黑暗中随机拍摄:用True替换True?创建一个名为BoolHelper的静态类,使用包含Dynami解决方案的静态方法boolparse(strings)。然后使用它来简化解析器的工作。