C#使用LINQ和可空布尔

C#使用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

我有下面的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)
在阅读之后,我发现了一些说明内联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)。然后使用它来简化解析器的工作。