Σε αυτό το άρθρο, ο συγγραφέας παρουσιάζει λεπτομερώς το κοινό ερώτημα Linq, γιατί φοβάμαι ότι οι αναγνώστες απλώς δεν καταλαβαίνουν πολύ καλά αυτήν την πτυχή, οπότε πριν μιλήσω για το κοινό ερώτημα Linq, θα σας δώσω πρώτα κάποιες γνώσεις και, στη συνέχεια, θα μιλήσω για το πώς υλοποιείται το κοινό ερώτημα Linq, ελπίζοντας να σας βοηθήσω.
Αρχικά, ας κατανοήσουμε ορισμένα σημεία γνώσης του κοινού ερωτήματος Linq.
1. Ανώνυμος τύπος παράδοσης
στατικό κενό Main(string[] args) { var Χρήστης = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(Χρήστης.ΌνομαΧρήστη); } στατικό αντικείμενο GetAnonymous() { var User = νέο { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; επιστροφή Χρήστη.
} Όταν ορίζουμε έναν ανώνυμο τύπο, μπορεί να περάσει μόνο μέσω του τύπου αντικειμένου και ο μεταγλωττιστής δεν θα γνωρίζει τον πραγματικό τύπο του ανώνυμου τύπου μετά το πέρασμα.
Αυτή η γραμμή μπορεί να μεταδοθεί μέσω της μεθόδου επέκτασης Cast. Παρακάτω είναι ένα πρωτότυπο της μεθόδου Cast.
δημόσιο στατικό T Cast(αυτό το αντικείμενο o, T t) { επιστροφή ();
} 2. Πώς να δημιουργήσετε μια λίστα ανώνυμων τύπων για το ομοσπονδιακό ερώτημα Linq;
var Χρήστης = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = νέα λίστα< ?>(); Η αρχή είναι η ίδια με την παραπάνω.
var Χρήστης = νέος { Όνομα χρήστη = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Χρήστης.MakeList(); λίστα. Add(Χρήστης); Console.Write(λίστα[0]. Όνομα χρήστη); Ας ρίξουμε μια ματιά στη μέθοδο MakeList():
δημόσια στατική λίστα MakeList(αυτό το T t) { επιστροφή νέας List();
} Φυσικά, μπορεί να πιστεύετε ότι η παραπάνω μέθοδος δεν είναι αρκετά τέλεια και πρέπει να προσθέσετε έναν Χρήστη στη Λίστα, επομένως έχετε την ακόλουθη μέθοδο:
δημόσια στατική λίστα MakeList (αυτό το T t,params T[] στοιχεία) { επιστροφή νέας λίστας (στοιχεία). } Όταν καλείται, μπορεί να γραφτεί ως:
var Χρήστης = νέος { Όνομα χρήστη = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Χρήστης.MakeList(Χρήστης); Console.Write(λίστα[0]. Όνομα χρήστη); Αυτή τη φορά, ας πάμε στο κυνήγι και ας καταλάβουμε πώς υλοποιείται το ομοσπονδιακό ερώτημα Linq.
var q = από p σε db. Προϊόντα όπου p.Supplier.Country == "ΗΠΑ" && p.UnitsInStock == 0 επιλέξτε p; Το παραπάνω ερώτημα είναι δύο σχετικοί πίνακες και επιστρέφονται μόνο τα περιεχόμενα ενός πίνακα, σε αυτήν την περίπτωση, μια λίστα με ισχυρή πληκτρολόγηση μπορεί να επιστραφεί στο επίπεδο δεδομένων. Για παράδειγμα:
δημόσια λίστα SelectProducts() { var q = από το p στο db. Προϊόντα όπου p.Supplier.Country == "ΗΠΑ" && p.UnitsInStock == 0 επιλέξτε p; επιστροφή q.ToList;
} Εάν το επιστρεφόμενο σύνολο αποτελεσμάτων είναι περισσότεροι από δύο πίνακες, πώς πρέπει να περάσει; Πρέπει να έχετε σκεφτεί ότι εάν το σύνολο αποτελεσμάτων που επιστρέφεται είναι μία γραμμή δεδομένων, μπορούμε να χρησιμοποιήσουμε τον ανώνυμο τύπο παράδοσης που αναφέραμε προηγουμένως για να λάβουμε τα αποτελέσματα που χρειαζόμαστε. δημόσιο αντικείμενο
δημόσιο αντικείμενο SelectProducts() { var q = από το p στο db. Προϊόντα όπου p.Supplier.Country == "ΗΠΑ" && p.UnitsInStock == 0 επιλέξτε νέο {p.UnitsInStock,p.Supplier.Sid}; var αποτέλεσμα = q.Single(); αποτέλεσμα επιστροφής?
} Ωστόσο, αυτή η προϋπόθεση είναι ότι το επίπεδο επιχειρηματικής λογικής πρέπει να γνωρίζει τους συγκεκριμένους τύπους τύπων ανωνυμίας στο επίπεδο δεδομένων. Αυτή η διαστρωμάτωση έχει μικρή σημασία. Δεν είναι αυτό που θέλουμε. Επιπλέον, η μέθοδος χρήσης του ανώνυμου τύπου λίστας για την επιστροφή του συνόλου αποτελεσμάτων δεδομένων πολλών σειρών απέτυχε επίσης μετά από πειράματα. Αυτό σημαίνει ότι καμία από τις δύο μεθόδους μετάδοσης της ανωνυμίας στην αρχή αυτού του άρθρου δεν θα λειτουργήσει.
Μέθοδος 1: Το ομόσπονδο ερώτημα Linq προσαρμόζει με την ίδια δομή με τον τύπο επιστροφής
CustomQuery δημόσιας τάξης { public uint UnitsInStock { πάρτε; σειρά; } public int Sid { πάρτε; σειρά; }
} Αυτό μπορεί να επιλυθεί όταν τα αποτελέσματα του ερωτήματος είναι ένα σύνολο αποτελεσμάτων πολλών πινάκων. Εφόσον πρέπει να γνωρίζετε τον τύπο της ανωνυμίας που επιστρέφεται, πρέπει να ορίσετε μια πρόσθετη κλάση εκτός από τη μη συμμόρφωση με το πολυστρωματικό. Αλλά αυτό είναι αλήθεια και μπορεί να επιστρέψει τα αποτελέσματα που χρειαζόμαστε χρησιμοποιώντας ισχυρούς τύπους.
Μέθοδος 2: Ομόσπονδο ερώτημα Linq χρησιμοποιώντας την ανάθεση System.Func (Αναφορά: Επιστροφή var από μια μέθοδο στο C# 3.0)
Επίπεδο δεδομένων:
δημόσιο IEnumerable GetCustomersWithOrders(Func, Προβολή> προβολή) { επιστροφή από τον πελάτη σε _customers let customerOrders = από παραγγελία σε _orders όπου τάξη. ΚωδΠελάτη = customer.ID επιλέξτε προβολή(πελάτης, πελάτηςΠαραγγελίες);
} Επίπεδο επιχειρηματικής λογικής:
var results = GetCustomersWithOrders( (πελάτης, παραγγελίες) => νέο { Όνομα = πελάτης. Όνομα OrderCount = παραγγελίες. Αριθμός() }); Το αποτέλεσμα που επιστρέφεται με αυτόν τον τρόπο εξακολουθεί να είναι ένας πραγματικός ανώνυμος τύπος στο επίπεδο επιχειρηματικής λογικής και μπορεί να χρησιμοποιηθεί απευθείας.
Μέθοδος 3: Τα ομόσπονδα ερωτήματα Linq χρησιμοποιούν αποθηκευμένες διαδικασίες ή προβολές. |