سؤال

لدي مشكلة فرعية Linq الفردية.

بالنظر إلى بنية البيانات التالية:

الأطفال الآباء ------- -------- ID ID ID PIRETID الموقع Hasfoo

(من الواضح أن هذا ليس الهيكل الحقيقي، لكنه قريب بما فيه الكفاية لهذا المثال)

أنا قادر على تشغيل هذا الاستعلام والحصول على النتيجة المرجوة:

bool b = (from p in Parents
          from c in Children
          where p.Id == 1 && c.ParentId == p.Id && c.Location == "Home"
          select c.HasFoo).SingleOrDefault();

لذلك إذا كان هناك طفل يحتوي على موقع "Home" لموقع الوالد من المعرف 1، فسوف أحصل على قيمة "HasFoo" الخاصة ب "Hasfoo"، وإلا، فسوف أحصل على خطأ، وهي القيمة "الافتراضية" ل Bool.

ومع ذلك، إذا حاولت كتابة الاستعلام حتى يكون لدي قائمة بالأشياء الأصل، مثل ذلك:

var parentList = from p in Parents
                 select new ParentObject
                 {
                   ParentId = p.ParentId,
                   HasHomeChildren = p.Children.Count(c => c.Location == "Home") > 0,
                   HasHomeChildrenWithFoo = (from c in p.Children where c.Location == "Home" select c.HasFoo).SingleOrDefault()
                 }

أحصل على الخطأ التالي عند التكرار خلال القائمة:

لا يمكن تعيين القيمة الفارغة للعضو بنوع System.Boolean وهو نوع قيمة غير لاطل.

ومع ذلك، لا أرى أين تأتي هذه القيمة "NULL" من ذلك.

هل كانت مفيدة؟

المحلول

أتساءل عما إذا كان المترجم هو استنتاج Hashomechildrenwithfoo لتكون BOOL، ولكن بعد ذلك يلقي في الواقع إلى Bool Nullable (وبالتالي فوضى مكالمة الفردية الخاصة بك). على أي حال، سأكون على استعداد للمراهنة، يمكنك إصلاحه بإلقاء نظرة على نوع لا يغلى في هذا الاختيار النهائي الذي يمكنك بعد ذلك افتراضيا يدويا إلى False عند NULL. ربما ستجعل الخطأ يزول، لكنه نوع من Kludge القوة الغاشمة.

var parentList = from p in Parents
                 select new ParentObject
                 {
                   ParentId = p.ParentId,
                   HasHomeChildren = p.Children.Any(c => c.Location == "Home"),
                   HasHomeChildrenWithFoo = (from c in p.Children where c.Location == "Home" select (bool?)c.HasFoo) ?? false)
                 }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top