Αυτό το άρθρο είναι ένα άρθρο καθρέφτη της αυτόματης μετάφρασης, κάντε κλικ εδώ για να μεταβείτε στο αρχικό άρθρο.

Άποψη: 16456|Απάντηση: 0

[ASP.NET] Επεξήγηση της επιστροφής του συνόλου αποτελεσμάτων του συνενωμένου πίνακα ερωτημάτων Linq

[Αντιγραφή συνδέσμου]
Δημοσιεύτηκε στις 8/5/2015 4:34:23 μ.μ. | | |

Σε αυτό το άρθρο, ο συγγραφέας παρουσιάζει λεπτομερώς το κοινό ερώτημα 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 χρησιμοποιούν αποθηκευμένες διαδικασίες ή προβολές.




Προηγούμενος:Το LINQ λαμβάνει αποθηκευμένη διαδικασία πρόβλημα τιμής επιστροφής της αποθηκευμένης διαδικασίας μου
Επόμενος:Η Microsoft εγκατέλειψε τον IE και ήταν αποφασισμένη να κάνει 220.000 γραμμές κώδικα
Αποκήρυξη:
Όλο το λογισμικό, το υλικό προγραμματισμού ή τα άρθρα που δημοσιεύονται από το Code Farmer Network προορίζονται μόνο για μαθησιακούς και ερευνητικούς σκοπούς. Το παραπάνω περιεχόμενο δεν θα χρησιμοποιηθεί για εμπορικούς ή παράνομους σκοπούς, άλλως οι χρήστες θα υποστούν όλες τις συνέπειες. Οι πληροφορίες σε αυτόν τον ιστότοπο προέρχονται από το Διαδίκτυο και οι διαφορές πνευματικών δικαιωμάτων δεν έχουν καμία σχέση με αυτόν τον ιστότοπο. Πρέπει να διαγράψετε εντελώς το παραπάνω περιεχόμενο από τον υπολογιστή σας εντός 24 ωρών από τη λήψη. Εάν σας αρέσει το πρόγραμμα, υποστηρίξτε γνήσιο λογισμικό, αγοράστε εγγραφή και λάβετε καλύτερες γνήσιες υπηρεσίες. Εάν υπάρχει οποιαδήποτε παραβίαση, επικοινωνήστε μαζί μας μέσω email.

Mail To:help@itsvse.com