LINQ

2010-01-06 6 views
7

का उपयोग कर डेटाबेस से पेड़ संरचना को पुनर्प्राप्त करना मेरे पास डेटाबेस में संग्रहीत एक संगठन चार्ट वृक्ष संरचना है। हैLINQ

class Employee 
{ 
int ID, 
string Name, 
IList < Employee> Subs 
} 

मैं सोच रहा हूँ की तरह की तरह

ID (int); 
Name (String); 
ParentID (int) 

कुछ सी # में एक वर्ग द्वारा यह प्रदर्शित किया गया है है कि कैसे का उपयोग कर सी # वस्तुओं को भरने के लिए डेटाबेस से इन मूल्यों को पुनः प्राप्त करने के लिए सबसे अच्छा तरीका है LINQ (मैं एंटिटी फ्रेमवर्क का उपयोग कर रहा हूं)

शीर्ष स्तर प्राप्त करने के लिए कॉल करने से पहले कुछ बेहतर होना चाहिए और फिर सबस्क प्राप्त करने के लिए बार-बार कॉल करना बेहतर होगा।

इसे कैसे करना सबसे अच्छा है?

उत्तर

1

मैं मूल आईडी को शामिल करने के लिए इकाई में एक फ़ील्ड जोड़ूंगा, तो मैं सूची तालिका को छोड़कर स्मृति में पूरी तालिका खींचूंगा। आईडी फिर ऑब्जेक्ट्स के माध्यम से पुन: प्रयास करें और वस्तुओं को linq का उपयोग करके सूची पॉप्युलेट करें। केवल एक डीबी क्वेरी उचित होना चाहिए।

+0

तरह से मैं इस foreach की तरह कुछ (सभी में स्थिति स्थिति) { foreach था ऐसा करने के लिए मिला: दोष यह है कि आप एक सरल जड़ क्वेरी परे कुछ भी के लिए यूडीएफ या संग्रहित प्रक्रियाओं का उपयोग करना होगा है सभी में स्थिति position1) { अगर (position1.ParentPositionID == position.ID) { अगर (position.Subs == नल) { position.Subs = नई सूची (); } स्थिति.Subs.Add (position1); } } } क्या कोई बेहतर तरीका है? – Emad

0

एक इकाई की रूपरेखा क्वेरी आप, संबंधित इकाई सेट शामिल करने के लिए हालांकि एक एकल रिश्ते में, नहीं यकीन है कि यह कैसे काम होता है कि अधिक जानकारी के लिए बाहर की अनुमति चाहिए ...

इस जांच: http://msdn.microsoft.com/en-us/library/bb896272.aspx

0

खैर ... LINQ के साथ भी आपको दो प्रश्नों की आवश्यकता होगी, क्योंकि कोई भी एकल प्रश्न मुख्य कर्मचारी को डुप्लिकेट करेगा और इस प्रकार कई कर्मचारियों (जो वास्तव में वही हैं) बनेंगे ... हालांकि, आप इसे थोड़ा सा छुपा सकते हैं जब आप ऑब्जेक्ट बनाते हैं तो linq, वह तब होता है जब आप दूसरी क्वेरी निष्पादित करेंगे, कुछ ऐसा:

var v = from u in TblUsers 
     select new { 
      SupervisorName = u.DisplayName, 
      Subs = (from sub in TblUsers where sub.SupervisorID.Value==u.UserID select sub.DisplayName).ToList() 
     }; 
3
  1. आप एक संग्रहित प्रो बना सकते हैं जो रिकर्सन में बनाया गया है। SQL सर्वर
  2. में सामान्य तालिका अभिव्यक्तियों के बारे में अधिक जानकारी के लिए http://msdn.microsoft.com/en-us/library/ms190766.aspx पर एक नज़र डालें, आप अपने डेटा को मॉडल करने के लिए एक अलग (बेहतर?) तरीका ढूंढना चाहेंगे। http://www.sqlteam.com/article/more-trees-hierarchies-in-sql डेटाबेस में पदानुक्रमित डेटा मॉडलिंग का एक लोकप्रिय तरीका सूचीबद्ध करता है। मॉडलिंग को बदलने से आप उन प्रश्नों को बनाने की अनुमति दे सकते हैं जिन्हें बिना रिकर्सन के व्यक्त किया जा सकता है।
2

यदि आप SQL Server 2008 का उपयोग कर रहे हैं, तो आप new HIERARCHYID सुविधा का उपयोग कर सकते हैं।

संगठनों डेटाबेस में संरचनाओं की तरह पेड़ के प्रतिनिधित्व के साथ अतीत में संघर्ष किया है, की बहुत मिलती जटिल तर्क के बहुत सारे में जगह चला जाता है, चाहे वह संगठन पदानुक्रम या बीओएम को परिभाषित है (बिल सामग्री) जहां एक उत्पाद समाप्त हुआ एक अन्य सेमी समाप्त सामग्री/किट आइटम पर निर्भर है और इन किट आइटम अन्य अर्ध तैयार आइटम या कच्चे माल पर निर्भर हैं।

एसक्यूएल सर्वर 2008 समस्या है जहाँ हम डेटा प्रकार HierarchyID में पूरे पदानुक्रम की दुकान का हल नहीं है। HierarchyID एक चर लंबाई प्रणाली डेटा प्रकार है।HierarchyID स्कॉट की तरह तत्व के पदानुक्रम में स्थिति का पता करने के लिए प्रयोग किया जाता है सीईओ और मार्क के साथ-साथ स्कॉट और बेन और लौरा मार्क, विजय, जेम्स को रिपोर्ट और फ्रैंक रवि को रिपोर्ट के रवि रिपोर्ट है।

तो उपलब्ध नए कार्यों का उपयोग करें, और LINQ का उपयोग किए बिना आपको आवश्यक डेटा वापस कर दें। (

SELECT @Manager = CAST('/1/' AS hierarchyid)   
SELECT @FirstChild = @Manager.GetDescendant(NULL,NULL) 
संबंधित मुद्दे