2010-07-05 26 views
7

Y, N veya DBnull olabilecek ve boole içeren bir metin alanı alan aşağıdaki linq sorgum var? Alanın değerine bağlı olarak True, False veya null parametresi.C# LINQ ve Nullable kullanarak Boolean

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 

sorunlu hat

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

kadar okuduktan sonra ben satır içi 2. ve 3. argümanlar ihtiyaç aynı tipte veya birine örtük olarak dönüştürülebilir olması durumunda belirtiyor bazı belgelere bulundu olduğunu bir diğeri.

Sorum şu ki, istediğim sonucu elde etmek için bu sınırlamayı nasıl aşabilirim?

C# 'ya nispeten yeni geliyorum, bu yüzden henüz tüm quirks/yeteneklerine aşina değilim. Açıkça için ifadelerden birini veya birkaçını dönüştürebilirsiniz

cevap

6

Benim önerim ile değiştirmek olacaktır: derleyici olmadan kabul etmemesi neden

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

nedenle cast, bir nullable yapıya saklasanız bile, üçlü işlemin sonuçların örtük bir dönüşümle uyumlu olup olmadığını kontrol etmesidir.

Sonuçlar true ve falsenull için bu şekilde dolaylı olarak dönüştürülebilir özellikte değildir, bool değişmezleri değil, bool? olarak kabul edilir. Her iki sonuç da bool?'a dökülmeleri onları karşılaştırılabilir kılacaktır. Ben öneren kişi bool? ve null arasında örtük çevirim yapmayı vardır ve bu da çalışır: bool ve bool? bir arasında örtük dönüştürme olur

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

. Ben keyfi ilk birini tercih ederim ..

+0

Bu büyük Dynami çalıştı. Ben şimdi aşağıdaki kod ile bir DisplayTemplate değeri kullanmaya çalıştığım satır aşağı doğru bir sorun oluyor: <% @ Denetim Dili = "C#" Inherits = "System.Web.Mvc.ViewUserControl "%> <%: ((Boolean?) Model.Value == Doğru)? "kpi_tick.png": "kpi_cross.png"%> Gerçek şu ki, gerçek için gerçek, çapraz görüntü için bir onay görüntüsü ve tanımlanmamış görüntü yok (henüz bu kodun bir kısmını yapmadım) . "Geçerli" adı geçerli bağlamda mevcut değil "hatası alıyorsunuz" – hermiod

+2

Bu biçimlendirme, son zamanlarda çok çalıştım ASP.NET gibi görünüyor. Yani karanlıkta rastgele atış: True ile gerçek yerine? –

+0

Dynami'nin çözümünü içeren bir statik yöntem bool Parse (dize) ile BoolHelper adlı bir statik sınıf oluşturun. Sonra, ayrıştırıcınız için işleri basitleştirmek için bunu kullanın. –

2

bir bool?:

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