2011-10-26 13 views
10
में समूह नहीं है

शैक्षिक उद्देश्यों के लिए मैं VB.net में पुस्तक "कार्रवाई में Linq" से निम्नलिखित Linq अभिव्यक्ति कन्वर्ट करने के लिए करने की कोशिश कीLinq VB.Net

मूल सी #

var list = 
    from book in SampleData.Books 
    group book by new { book.Publisher.Name, book.Subject } 
    into grouping 
    select new { 
    Publisher = grouping.Key.Publisher, 
    Subject = grouping.Key.Subject, 
    Book = grouping 
    }; 

मेरे प्रयास:

Dim list = _books.GroupBy(Function(book) New With {.Publisher = book.Publisher.Name, 
                book.Subject}). 
        Select(Function(grouping) New With {.Publisher = grouping.Key.Publisher, 
                 .Subject = grouping.Key.Subject, 
                 .Books = grouping}) 

For Each item In list 
    Console.WriteLine("Publisher:" & item.Publisher & ", Subject:" & item.Subject) 
    For Each Book In item.Books 
    Console.WriteLine(" " & Book.Title) 
    Next 
Next 

यह निम्न उत्पादन की ओर जाता है:

Publisher:FunBooks, Subject:Fun 
    Funny Stories 
Publisher:Joe Publishing, Subject:Work 
    LINQ rules 
Publisher:Joe Publishing, Subject:Work 
    C# on rails 
Publisher:Joe Publishing, Subject:Fun 
    All your base are belong to us 
Publisher:FunBooks, Subject:Fun 
    Bonjour mon Amour 

मुझे उम्मीद थी कि पुस्तकें "LINQ नियम" और "सी # ऑन रेल" के साथ-साथ पुस्तकें "मजेदार कहानियां" और "बोनजोर मोन एमोर" भी बनाई गई हैं क्योंकि उनके पास एक ही प्रकाशक और विषय है। मेरी अनाम कुंजी में दो साधारण तारों की एक नई वस्तु होती है।

मैंने पहले ही एसओ में खोज करने की कोशिश की है, लेकिन other (or) उत्तर मेरी समस्या का समाधान नहीं करते हैं। यहां तक ​​कि telerik या carlosag जैसे कुछ कोड अनुवादक इस मामले में कोई सहायता नहीं करते हैं।

उत्तर

7

यह समस्या है:

GroupBy(Function(book) New With {.Publisher = book.Publisher.Name, 
            book.Subject}) 

, सी # संस्करण के बराबर नहीं है ऐसा इसलिए है क्योंकि दुर्भाग्य से वीबी डिफ़ॉल्ट रूप से गुमनाम प्रकार में परिवर्तनशील गुण का उपयोग करता है, और परिवर्तनशील गुण हैश के भाग के रूप में नहीं माना जाता कोड या समानता संचालन। आपको दोनों गुणों को "कुंजी" गुण बनाना होगा:

GroupBy(Function(book) New With {Key .Publisher = book.Publisher.Name, 
           Key book.Subject}) 

फिर यह ठीक काम करना चाहिए। आप वीबी on MSDN में अज्ञात प्रकारों के बारे में अधिक पढ़ सकते हैं।

+1

हाँ इस महान काम करता है; आपका बहुत बहुत धन्यवाद! वाह, जॉन स्कीट द्वारा खुद का जवाब। मैं सम्मानित महसूस करता हूँ। :-) – Markus

+0

मैंने अपनी क्वेरी का परीक्षण किया जो LINQPad में इसके कारण विफल रहा था और मैंने LINQ से Entities स्रोत का उपयोग किया था। मेरे कोड में मैं वास्तव में क्वेरी (ToList) को भौतिक रूप से पूरा कर रहा हूं और उस से समूह क्वेरी चला रहा हूं क्योंकि मुझे अंतरिम में कुछ प्रति पंक्ति गणना करना है। इससे मुझे विश्वास होता है कि यह LINQ से ऑब्जेक्ट्स में समस्या है लेकिन LINQ से इकाइयों तक नहीं है। मुझे लगता है कि ऐसा इसलिए होगा क्योंकि LINQ से इकाइयों में, समूह अभिव्यक्ति का अनुवाद TSQL में किया जाता है जबकि LINQ से ऑब्जेक्ट्स में, हैश कोड समूह कुंजी समानता के लिए उपयोग किया जाता है। क्या यह सही है? – pseudocoder

+0

@pseudocoder: नहीं, यह हैश कोड के बारे में नहीं है - यह समानता निर्धारित करने के लिए किस गुण का उपयोग किया जाता है। ऐसा लगता है कि LINQ से Entities * सभी * गुणों को प्रमुख गुणों के रूप में मानता है ... जो मुझे एक बग की तरह लगता है। यह LINQ से ऑब्जेक्ट्स में "समस्या" नहीं है - यह केवल एक बात है कि वीबी में गुमनाम प्रकार कैसे काम करते हैं। –

5

जबकि मैं नमूने का अनुवाद करने के आपके प्रयासों की सराहना करता हूं, हम वास्तव में सीएन # में एक्शन में LINQ के लिए सभी नमूने हैं और वीबी मैनिंग साइट से डाउनलोड के लिए उपलब्ध हैं: http://www.manning.com/marguerie/। साथ ही, हमने नमूनों को आजमाने और अपने परिवर्तनों को सहेजना आसान बनाने के लिए लिंककैड नमूने में नमूने जोड़े हैं। उस तक पहुंचने के निर्देशों के लिए http://www.thinqlinq.com/Default/LINQ-In-Action-Samples-available-in-LINQPad.aspx देखें।

ऐसा प्रतीत होता है कि आप उदाहरण 5.06b पर काम कर रहे हैं। यह थोड़ा अपडेट कर रहा है, हमारे वीबी अनुवाद है:

Dim query = _ 
    From book In SampleData.Books _ 
    Group book.Title By book.Publisher, book.Subject Into grouping = Group _ 
    Select _ 
    Publisher = Publisher.Name, _ 
    Subject = Subject.Name, _ 
    Titles = grouping 

आप लैम्ब्डा सिंटैक्स का उपयोग करना चाहते हैं, आप के रूप में @johnskeet संकेत दिया कुंजी निर्दिष्ट करने की आवश्यकता है:

Dim list = SampleData.Books.GroupBy(Function(book) New With { 
          Key .Publisher = book.Publisher.Name, 
          Key .Subject = book.Subject}). 
       Select(Function(grouping) New With { 
        .Publisher = grouping.Key.Publisher, 
        .Subject = grouping.Key.Subject, 
        .Books = grouping}) 
+0

ठीक है, और खुद लेखक ... :-) linq-links और कोड स्निपेट के लिए धन्यवाद। – Markus