سؤال

لدي الذاتي الرجوع إلى جدول الفئات.كل فئة لديها معرف_الفئة, ParentCategoryID, CategoryName ، إلخ.و كل فئة يمكن أن يكون أي عدد من الفئات الفرعية ، ولكل من هذه الفئات الفرعية يمكن أن يكون أي عدد من الفئات الفرعية ، و هكذا و دواليك.وذلك أساسا شجرة يمكن أن يكون X مستويات عميقة.

ثم المنتجات المرتبطة ورقة (sub) فئات.هل هناك طريقة للحصول على جميع المنتجات لأي فئة (التي من شأنها أن تكون جميع المنتجات المرتبطة جميع أوراق أحفاد) باستخدام LINQ to SQL ؟

هذا يبدو وكأنه مشكلة متكررة.هل الأفضل استخدام إجراء مخزن بدلا من ذلك ؟

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

المحلول

لا أعتقد linq إلى sql لديه إجابة جيدة على هذه المشكلة.منذ كنت تستخدم sql server 2005 يمكنك استخدام CTEs للقيام الاستعلامات الهرمية.إما إجراء مخزن أو مضمنة استعلام (باستخدام DataContext.ExecuteQuery) سوف تفعل خدعة.

نصائح أخرى

حسنا هنا هو رهيب هرع التنفيذ باستخدام LINQ.لا تستخدم هذا :-)

public IQueryable GetCategories(Category parent)
{
    var cats = (parent.Categories);
    foreach (Category c in cats )
    {
        cats  = cats .Concat(GetCategories(c));
    }
    return a;
}

Performant النهج لإنشاء إدخال/تعديل/حذف الزناد الذي يحافظ مختلفة تماما الجدول الذي يحتوي على عقدة سلف أزواج لجميع أسلاف جميع العقد.هذه الطريقة ، بحث O(N).

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

طريقة التعامل مع هذا باستخدام بعض أساليب الإرشاد (الفلاتر).لقد كتبت بعض التعليمات البرمجية من مشروع كنت قد نفذت هذا.تبدو على وجه التحديد في خطوط حيث أنا والتزويد ParentPartner كائن و SubPartners قائمة.

public IQueryable<Partner> GetPartners()
        {
            return from p in db.Partners
                   select new Partner
                   {
                       PartnerId = p.PartnerId,
                       CompanyName = p.CompanyName,
                       Address1 = p.Address1,
                       Address2 = p.Address2,
                       Website = p.Website,
                       City = p.City,
                       State = p.State,
                       County = p.County,
                       Country = p.Country,
                       Zip = p.Zip,
                       ParentPartner = GetPartners().WithPartnerId(p.ParentPartnerId).ToList().SingleOrDefault(),
                       SubPartners = GetPartners().WithParentPartnerId(p.PartnerId).ToList()
                   };
        }


public static IQueryable<Partner> WithPartnerId(this IQueryable<Partner> qry, int? partnerId)
        {
            return from t in qry
                   where t.PartnerId == partnerId
                   select t;
        }

public static IQueryable<Partner> WithParentPartnerId(this IQueryable<Partner> qry, int? parentPartnerId)
        {
            return from p in qry
                   where p.ParentPartner.PartnerId == parentPartnerId
                   select p;
        }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top