2010-07-05 59 views
7

我有以下linq查詢需要一個文本字段可能是Y,N或DBnull和填充布爾?參數可以是True,False或null,具體取決於字段的值。C#使用LINQ和可空布爾

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#比較陌生,所以不熟悉它的所有怪癖/功能。

回答

6

我的建議是,以取代它:

(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null; 

爲什麼編譯器不同意無理由演員表示,即使您將其存儲到可空結構中,三元操作也會通過隱式轉換檢查結果是否兼容。

結果truefalse被視爲bool文字,不bool?,因此不隱式轉換爲null。將結果投射到bool?將使他們具有可比性。我提出的一個具有bool?null之間的隱含皈依,這也工作:

(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null; 

這是一個boolbool?之間的隱式轉換。我任意喜歡第一個..

+0

這工作很好的動力。我現在遇到了一個問題,我試圖在下面的代碼中使用DisplayTemplate中的值: <%@ Control Language =「C#」Inherits =「System.Web.Mvc.ViewUserControl 「%> <%:((布爾?)Model.Value == True)? 「kpi_tick.png」:「kpi_cross.png」%> 這個想法是,它會顯示一個真實的交叉圖像的勾號圖像,並且沒有未定義的圖像(還沒有完成該代碼的那一點) 。我收到錯誤「名稱」True「在當前上下文中不存在」 – hermiod 2010-07-05 22:19:25

+2

此標記看起來像ASP.NET,我最近一直在使用它。所以在黑暗中隨機拍攝:用真實代替True? – 2010-07-05 22:25:33

+0

使用靜態方法bool Parse(string s)創建一個名爲BoolHelper的靜態類,該靜態方法包含Dynami的解決方案。然後使用它來簡化解析器的事情。 – 2010-07-05 22:35:17

2

您可以顯式地轉換表達式的一個或多個的bool?

(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)