Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

LINQ groupby

Îåêßíçóå áðü ôï ìÝëïò dimos.homatas. Τελευταία δημοσίευση από το μέλος dimos.homatas στις 10-02-2011, 19:14. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-02-2011, 13:04 63138

    LINQ groupby

    Καλησπέρα σας,

    έχω ένα αντικείμενο το οποίο έχει δύο "foreign" ids ως properties.

    πχ

    Το αντικείμενο myObject έχει τα properties int id1, int id2

    έχω μία λίστα από τέτοια αντικείμενα, στην οποία θέλω να κάνω ένα διπλό groupby, πρώτα με το id1 και έπειτα με το id2.

    Είδα και απόειδα με τα παραδείγματα στην γνωστή σελίδα 101 LINQ Samples αλλά άκρη δεν έβγαλα... μπόρεσα να κάνω το μονό groupby, αλλά το διπλό με τίποτα.

    Ο σκοπός μου είναι στο τέλος να κάνω ένα τριπλό for each:

    Για κάθε ομάδα-id1
    Για κάθε ομάδα-id2
    Για κάθε myobject

    Τέλος πάντων, έγινε η δουλειά με άλλον τρόπο (έσπασα τα linq queries με where, άλλες υπο-λίστες) αλλά δεδομένου ότι υπάρχει και καλύτερος τρόπος, θα ήθελα να τον μάθω Smile

    Ευχαριστώ

    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  09-02-2011, 14:55 63143 σε απάντηση της 63138

    Απ: LINQ groupby

    To group στο LINQ δεν δουλεύει όπως το group στην SQL. Στο by δίνεις ένα function το οποίο δημιουργεί το κλειδί με το οποίο θα δημιουργηθούν τα groupings. Έτσι, μπορείς να δώσεις ένα τύπο ή να δημιουργήσεις ένα καινούριο αντικείμενο για κλειδί. Αυτό φαίνεται και από τα παραδείγματα στο documentation του group clause.

    Για να δημιουργήσεις ένα grouping βασισμένο σε δύο ή περισσότερα πεδία, μπορείς να δημιουργήσεις ένα anonymous type με τα πεδία που χρειάζεσαι όπως παρακάτω:
    var groupQuery1 = from product in products
                               group product by new {product.TypeID, product.CategoryID} into categories
                               select categories;
    To categories είναι ένα αντικείμενο IGrouping με ένα property Key το οποίο περιέχει τα TypeID, Category ID. Έτσι μπορείς να κάνεις άλλο ένα επίπεδο grouping, ομαδοποιώντας πλέον κατά TypeID ή κατά Category ID:
    var groupQuery = from product in products
                             group product by new {product.TypeID, product.CategoryID} into categories
                             group categories by categories.Key.TypeID into types
                             select types;
    Για να τυπώσεις τα διάφορα groups θα χρειαστείς τρία foreach, όπως παρακάτω:
                foreach (var types in groupQuery)
                {
                    Console.WriteLine("TypeID: {0}",types.Key);
                    foreach (var category in types)
                    {
                        Console.WriteLine("\tCategoryID: {0}", category.Key.CategoryID);
                        foreach (var product in category)
                        {
                            Console.WriteLine("\t\t{0} {1} {2}", product.TypeID, product.CategoryID, product.Name);
                        }
                    }
                }
    Το products είναι ένα array από Product, το οποίο με τη σειρά του περιέχει τα properties Name, TypeID, CategoryID.
    Αντί για το σύνθετο κλειδί θα μπορούσα να είχα δώσει ένα expression όπως στα παραδείγματα του group, π.χ. TypeID %10 για να ομαδοποιήσω με βάση το τελευταίο ψηφίο του TypeID. Αν ομαδοποιούσα αρχεία ή blobs, το group θα μπορούσε να είναι το SHA256 hash του blob, για να βρω ποιά blobs είναι διπλά.

    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  09-02-2011, 15:17 63146 σε απάντηση της 63143

    Απ: LINQ groupby

    Παναγιώτη ευχαριστώ, θα το εφαρμόσω αύριο.
    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
  •  10-02-2011, 19:14 63187 σε απάντηση της 63146

    Απ: LINQ groupby

    Δεν το έκανα ακόμα... κάηκε το switch και ήταν λίγο τρελοκομείο η κατάσταση.
    "When the darkness rises up from inside - that is normal.
    It's when you reach down to pull it up - that the noxious warnings sound."
    Tuzak, Farscape
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems