2008-09-04 10 views
5

मेरे पास एक आत्म संदर्भ श्रेणियाँ तालिका है। प्रत्येक श्रेणी में एक श्रेणी आईडी, अभिभावक श्रेणी, श्रेणी नाम, आदि होती है और प्रत्येक श्रेणी में उप श्रेणियों की संख्या हो सकती है, और उनमें से प्रत्येक उप श्रेणियों में उप-श्रेणियों की संख्या हो सकती है, और इसी तरह और बहुत आगे। तो मूल रूप से पेड़ एक्स स्तर गहरा हो सकता है।स्वयं-संदर्भ तालिकाओं के लिए LINQ से SQL?

तब उत्पाद पत्ते (उप) श्रेणियों से जुड़े होते हैं। LINQ से SQL का उपयोग कर किसी दिए गए श्रेणी (जो उसके सभी पत्ते वंश से जुड़े सभी उत्पाद) के लिए सभी उत्पाद प्राप्त करने का कोई तरीका है?

यह एक पुनरावर्ती समस्या की तरह लगता है। क्या इसके बजाय एक संग्रहित प्रक्रिया का उपयोग करना बेहतर है?

उत्तर

3

मुझे नहीं लगता कि linq-to-sql का इस समस्या का अच्छा जवाब है। चूंकि आप एसक्यूएल सर्वर 2005 का उपयोग कर रहे हैं, इसलिए आप पदानुक्रमित प्रश्नों के लिए सीटीई का उपयोग कर सकते हैं। या तो एक संग्रहीत प्रक्रिया या एक इनलाइन क्वेरी (DataContext.ExecuteQuery का उपयोग करके) चाल चलती है।

1

ठीक है यहां LINQ का उपयोग करके एक भयानक पहुंचाया गया कार्यान्वयन है। इस :-)

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

performant दृष्टिकोण/एक डालने बनाएं, संशोधित करें/ट्रिगर जो एक बिल्कुल अलग तालिका जो सभी नोड्स के सभी पूर्वजों के लिए नोड पूर्वज जोड़े शामिल रखता है को नष्ट करने के लिए है का उपयोग न करें। इस तरह, लुकअप ओ (एन) है।

नोड और उसके सभी वंशजों से संबंधित सभी उत्पादों को प्राप्त करने के लिए इसका उपयोग करने के लिए, आप केवल उन सभी श्रेणी नोड्स का चयन कर सकते हैं जिनके पास आपका लक्ष्य नोड पूर्वजों के रूप में है। इसके बाद, आप बस इनमें से किसी भी श्रेणी से संबंधित किसी भी उत्पाद का चयन करते हैं।

1

जिस तरह से मैं इसे संभालने का तरीका कुछ विस्तार विधियों (फ़िल्टर) का उपयोग कर रहा हूं। मैंने एक प्रोजेक्ट से कुछ नमूना कोड लिखा है जिस पर मैंने इसे लागू किया है। विशेष रूप से उन रेखाओं पर देखें जहां मैं एक अभिभावक पार्टनर ऑब्जेक्ट और उप-चार्टर्स सूची पॉप्युलेट कर रहा हूं।

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; 
     } 
+0

मुझे लगता है कि यह एक अच्छा विचार है, लेकिन इसे लागू करने का प्रयास करते समय मुझे एक त्रुटि मिलती है। यह कहता है कि "WithPartnerId" एक्सटेंशन विधियों में SQL के लिए कोई समर्थित अनुवाद नहीं है। कोई विचार? –