2010-09-30 16 views
9

से डेटा समूह में LINQ का उपयोग करें, मैं डेटाटेबल (कॉलम: उपयोगकर्ता आईडी, chargetag, चार्ज) से LINQ डेटा समूह का उपयोग करना चाहता हूं।डेटाटेबल

सामग्री ऐसा दिखाई दे सकता:

userid chargetag charge 
----------------------------- 
user1  tag3   100 
user2  tag3   100 
user3  tag5   250 

मैं एक परिणाम के रूप कुछ इस तरह की जरूरत है:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        let count = g.Count() 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = count, 
        }; 

मैं:

chargetag count sum 
------------------------- 
tag3   2  200 
tag5   1  250 

यह वही है मैं अब तक राशि है chargetag का नाम और इसकी संख्या निकाल सकते हैं। शुल्क की राशि तक पहुंचने के लिए मुझे LINQ क्वेरी को कैसे बदलना होगा?

अग्रिम धन्यवाद :-)

सादर, केविन

उत्तर

34

बहुत आसान है कि - बस Sum विस्तार विधि समूह पर इस्तेमाल करते हैं।

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = g.Count(), 
         ChargeSum = g.Sum(x => x.Field<int>("charge")) 
        }; 

(मैं let खंड यहाँ हटा दिया है के रूप में यह वास्तव में आप कुछ भी खरीद नहीं की गई थी।)

अब जब कि अक्षम हो सकता है; यह दो समेकन संचालन करने के लिए दो बार समूहबद्ध हो सकता है। आप को ठीक कर सकता है कि इस तरह एक प्रश्न निरंतरता के साथ की तरह, अगर आप वास्तव में चाहते थे:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        select new 
        { 
         ChargeTag = g.Key, 
         List = g.ToList(), 
        } into g 
        select new 
        { 
         g.ChargeTag, 
         Count = g.List.Count, 
         ChargeSum = g.List.Sum(x => x.Field<int>("charge")) 
        }; 

या बजाय एक let खंड के साथ:

var groupedData = from b in dataTable.AsEnumerable() 
        group b by b.Field<string>("chargetag") into g 
        let list = g.ToList() 
        select new 
        { 
         ChargeTag = g.Key, 
         Count = list.Count, 
         ChargeSum = list.Sum(x => x.Field<int>("charge")) 
        }; 
+0

अच्छा विवरण (हमेशा की तरह)। मुझे यह जानने में दिलचस्पी होगी कि पहला विकल्प वास्तव में दो बार समूह करता है या यदि यह अनुकूलित हो जाता है। – kjn

+0

पूरी तरह से काम करता है (बेशक ;-)) फिर से धन्यवाद! – bitfrickler

+0

@ जोन स्कीट: इस LINQ सामान को समझने के लिए मेरे लिए एक अच्छा तरीका क्या है? मुझे आपकी 'सी # गहराई' किताब मिली है, लेकिन मैं LINQ सेक्शन में खो गया हूं (जैसा कि ऊपर दिया गया है)। शेष कोडिंग सामान बहुत खराब नहीं है। – jp2code