سؤال

لدي استعلام 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top