C#使用LINQ和可空布尔值

7

我有一个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#的所有怪癖/功能都不熟悉。

2个回答

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;

这是指一个布尔类型的变量和一个可空布尔类型之间的隐式转换。我个人更喜欢第一种方式。

那很好Dynami。我现在遇到了一个问题,当我尝试使用下面的代码中的DisplayTemplate中的值时,会出现问题:<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Boolean?>" %><%: ((Boolean?)Model.Value == True) ? "kpi_tick.png" : "kpi_cross.png" %>这个想法是,它将显示一个对勾图像表示true,一个叉图像表示false,并且未定义的情况下不显示图像(还没有完成代码)。我收到错误消息“当前上下文中不存在名称'True'”。 - hermiod
2
这个标记看起来像是ASP.NET,我最近没有太多接触。所以猜测一下:将True替换为true? - Dynami Le Savard
创建一个名为BoolHelper的静态类,其中包含Dynami的解决方案的静态方法bool Parse(string s)。然后使用它来简化解析器的操作。 - Peter Wone

2
您可以将一个或多个表达式明确转换为bool?:
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接