C# باستخدام linq و nullable boolean
-
02-10-2019 - |
سؤال
لدي استعلام LINQ أدناه الذي يأخذ حقل نص قد يكون y أو n أو dbnull ويمشئ منطقية؟ المعلمة مع إما صواب ، خطأ أو فارغ اعتمادا على قيمة الحقل.
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# ، لذا لست على دراية بكل مراوغاتها/قدراتها حتى الآن.
المحلول
اقتراحي هو استبداله بـ:
(i.targetmet != null) ? (bool?)(i.targetmet == "Y") : null;
السبب وراء عدم توافق المترجم بدون طاقم العمل هو أنه حتى إذا قمت بتخزينه في بنية قابلة للبطولة ، فإن العملية الثلاثية تتحقق مما إذا كانت النتائج متوافقة من خلال تحويل ضمني.
نتائج true
و false
يعاملون على أنها bool
الحرفية ، لا bool?
, ، وبالتالي لا يمكن تحملها ضمنيًا إلى null
. يلقي أي من النتائج ل bool?
سيجعلها مماثلة. الشخص الذي اقترحته لديه تحويل ضمني بين bool?
و null
, وهذا يعمل أيضًا:
(i.targetmet != null) ? (i.targetmet == "Y") : (bool?)null;
وهو تحويل ضمني بين أ bool
و bool?
. أنا تعسفي أفضل واحد ..
نصائح أخرى
يمكنك تحويل واحد أو أكثر من التعبيرات بشكل صريح bool?
:
(i.targetmet == "Y") ? true : ((i.targetmet == "N") ? (bool?)false : (bool?)null)