استخدام LINQ إلى الاستعلام عن محطة العقد / ورقة في التسلسل الهرمي الجدول / نمط مركب

StackOverflow https://stackoverflow.com/questions/414945

سؤال

ولدي جدول المرجعية الذاتية مع رقم، اسم الفئة، وParentId. إنه سيناريو نموذجي جدول التسلسل الهرمي للفئات التي يمكن أن تقسم نفسها إلى الفئات التي يقول خبراء DB لي ما يسمى نموذج الجوار.

ما أريده هو أن استخدام LINQ إلى SQL للاستعلام عن الفئات الفرعية التي ترتبط أنفسهم دون فئات فرعية أخرى، أي أنهم رقة العقد فورا من بعض فئة معينة أو فئة فرعية.

والجزء السهل، حصلت، الذي هو مجرد الحصول الفئات الفرعية. بالحرج تقريبا لوضع الشفرة هنا. لكننا لا نود أن نرى كود ..

IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();  

ولكن تضيق عليه إلى فئات فرعية مع أي تحول لي حولها. أي مساعدة سيكون محل تقدير كبير.

وشكرا لك مساعدة. جيف

وUPDATE ** ويبدو هذا يعمل، ولكن اذا كان شخص ما يمكن أن يؤكد أنه "السليم" سأكون ممتنا. لذا، إذا أريد رقة العقد تحت فئة مع معرف = 1، وأود أن تفعل هذا:

Categories.Where( c => !c.Children.Any ( d => d.ParentId == c.Id)).Where( e => e.ParentId == 1) 

و"الأطفال" هو اسم ينق يعطي الجمعية ذاتية المرجعية.

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

المحلول

والحل الخاص بك هو الصحيح لأن أسلوب Any()، يترجم إلى مزود "موجود) (" وظيفة و!c.Children.Any ( d => d.ParentId == c.Id)) يترجم إلى بند مزود مماثلة لNOT EXISTS (SELECT * FROM Categories WHERE ParentID = outerRef.ID)

وهناك طريقة أخرى للقيام بذلك هو استخدام Count:

Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)

ولكن المشرقية عادة () ويفضل أن COUNT () في مزود (لأسباب الأداء) لذلك الحل مع أي () يجب أن يكون على حق واحد.

نصائح أخرى

وأعتقد إذا فهمت سؤالك بشكل صحيح كنت في محاولة للحصول على كل العناصر الطفل التي ليس لها أطفال خاصة هناك ... هذا النفس الاستعلام ينضم الجدول على نفسه لاختبار إذا تم استخدام عقدة كوالد ، إذا لم يكن فإنه يتم عرضه في النتيجة.

ولست متأكدا إذا كان هذا يعمل ليس لدي أي شيء لاختباره على ...

   (from c in context
    join cc in context on c.id equals cc.parentid into temp
    from t in temp.DefaultIfEmpty()
    where t == null
    select c).ToList()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top