2010-05-24 9 views
6

मैं कुछ वर्षों से प्रोग्रामर रहा हूं लेकिन मैं
LINQ और C# के नवागंतुक हूं इसलिए मुझे माफ़ कर दो अगर मेरा प्रश्न
विशेष रूप से बेवकूफ लगता है।मैं क्लोज़ द्वारा संभावित एकाधिक समूह के साथ सी # में गतिशील LINQ क्वेरी कैसे बना सकता हूं?

मुझे उम्मीद है कि कोई मुझे सही
दिशा में इंगित करने में सक्षम हो सकता है। मेरा काम

स्रोत के रूप में एक सामान्य सूची का उपयोग कर सी # स्क्रिप्ट के भीतर linq क्वेरी द्वारा गतिशील एकाधिक समूह बनाने की क्षमता के साथ आना है।

FieldChar1 - character 
FieldChar2 - character 
FieldChar3 - character 
FieldNum1 - numeric 
FieldNum2 - numeric 

संक्षेप में मैं एक LINQ क्वेरी कि
FieldNum1 और FieldNum2 योग होगा बनाने के लिए सक्षम होना चाहते हैं:

उदाहरण के लिए, मैं निम्नलिखित
संरचना के साथ एक से अधिक आइटम से युक्त एक सूची है कहना किसी भी एक, दो या
द्वारा समूहीकृत फ़ील्डर फ़ील्ड के सभी तीनों को
रनटाइम पर उपयोगकर्ताओं की आवश्यकताओं के आधार पर और उसी क्वेरी में फ़ील्डशेर फ़ील्ड का चयन करने का निर्णय लिया जाएगा।

मेरे पास मेरी प्रोजेक्ट में dynamic.cs है जो समूहबैनी एक्सटेंशन विधि को प्रभावित करता है लेकिन मुझे यह मानना ​​है कि मुझे वास्तव में यह सुनिश्चित नहीं है कि इन्हें उपयोग करने के लिए कैसे रखा जाए। मैं वांछित परिणाम प्राप्त करने में सक्षम हूं यदि मैं अनुरोध से हार्ड-वायर्ड समूह के साथ एक क्वेरी का उपयोग करता हूं लेकिन गतिशील रूप से नहीं।

किसी भी गलत नामकरण के लिए क्षमा, मैं इस भाषा में नया हूं लेकिन किसी भी सलाह का स्वागत किया जाएगा।

बहुत धन्यवाद

एलेक्स

उत्तर

1

यहाँ बुनियादी GroupBy उदाहरण है। मान लीजिए कि हम इस तरह एक साधारण वर्ग करते हैं:

public class Person 
{ 
    public string Name { get; set; } 

    public int Age { get; set; } 

    public char Sex { get; set; } 
} 

उसके बाद, आप GroupBy इस तरह उपयोग कर सकते हैं:

var people = new List<Person> { 
    new Person { Name = "Joe", Age = 30, Sex = 'M' }, 
    new Person { Name = "Liz", Age = 22, Sex = 'F' }, 
    new Person { Name = "Jim", Age = 22, Sex = 'M' }, 
    new Person { Name = "Alice", Age = 30, Sex = 'F' }, 
    new Person { Name = "Jenny", Age = 22, Sex = 'F' } 
}; 
var groups = people.GroupBy(p => p.Age); 

foreach (var group in groups) 
{ 
    foreach (var person in group) 
     Console.WriteLine(person.Name + " - " + person.Age); 
} 

कई संपत्तियां द्वारा समूह के लिए के रूप में, इन देखें:
http://weblogs.asp.net/zeeshanhirani/archive/2008/05/07/group-by-multiple-columns-in-linq-to-sql.aspx
LINQ TO DataSet: Multiple group by on a data table

असल में, यह एक अज्ञात प्रकार के साथ एक ही वाक्यविन्यास है, उदाहरण के लिए:

var groups = people.GroupBy(p => new { p.Age, p.Sex }); 

ध्यान दें कि आप एक से अधिक OrderBy s का उपयोग करके की तलाश में जा सकता है:

var query = people.OrderBy(p => p.Age).ThenBy(p => p.Sex); 
//You can have unlimited ThenBy's 

भी ध्यान रखें कि पिछले GroupBy बयान और इस OrderBy बयान का परिणाम का नतीजा एक ही नहीं है।

+0

कई आपके उत्तर के लिए धन्यवाद। मैं इसकी सराहना करता हूं और मुझे देखने के लिए कुछ नया देता है। लेकिन क्या आपका उदाहरण प्राप्त करना संभव है ... var groups = people.GroupBy (p => new {p.Age, p.Sex}); कोड की एक पंक्ति में जहां क्लॉज (पी। एजे, पी.एक्सई) द्वारा समूह को पहले से बनाए गए एक चर स्ट्रिंग द्वारा प्रतिस्थापित किया जा सकता है जो आयु और/या सेक्स का कोई संयोजन हो सकता है? मैं फॉक्सप्रो/एसक्यूएल पृष्ठभूमि से आ रहा हूं जहां आप स्ट्रिंग कॉन्सटेनेशन का उपयोग करके गतिशील रूप से अपनी क्वेरी बना सकते हैं। फिर मैं आपकी मदद की सराहना करता हूं। – FordPrefect141

+0

@ फोर्डपेरफेक्ट 141 - LINQ के साथ, आप वास्तव में केवल तारों को संयोजित नहीं कर सकते हैं, क्योंकि LINQ को दृढ़ता से टाइप करने की आवश्यकता है। आप गतिशील रूप से ऐसी अभिव्यक्ति बनाकर कुछ समान प्राप्त कर सकते हैं। – Venemo

+0

आह-हा। तो आपके उदाहरण में यदि उपयोगकर्ता कभी-कभी लिंग और उम्र से समूह करना चाहता था, और कभी-कभी उम्र के अनुसार आप समूह के द्वारा वास्तव में कठिन कोडिंग किए बिना इसके बारे में कैसे जाएंगे? मैं फिर से माफ़ी मांगता हूं, यह मेरे लिए बिल्कुल नया है। बहुत धन्यवाद फिर से। – FordPrefect141

0

GroupBy (groupByName + "" + groupByDirection, नई {})

तो तुम groupByName और groupByDirection पास कर सकता है, जब आप के माध्यम से आगे बढ़ रहे हैं, आप

GroupBy (की तरह कुछ देख सकते हैं "lastName desc ", नए {})

या

GroupBy (" firstName एएससी ", नई {})

संबंधित मुद्दे