|
|
Veröffentlicht am 08.05.2015 16:34:23
|
|
|

In diesem Artikel stellt der Autor die Linq-Joint-Abfrage ausführlich vor, weil ich befürchte, dass die Leser diesen Aspekt einfach nicht sehr gut verstehen, daher werde ich, bevor ich über die gemeinsame Linq-Abfrage spreche, zunächst etwas Wissen für Sie darlegen und dann erklären, wie die Linq-Joint-Abfrage implementiert wird, in der Hoffnung, Ihnen weiterzuhelfen.
Zunächst wollen wir einige Wissenspunkte der Linq-Joint Query verstehen.
1. Anonyme Art der Zustellung
statisches Void Haupt(string[] args) { var User = GetAnonymous(). Cast(new { BenutzerName = "", LastLoginIp = "" }); Console.Write(Benutzer.Benutzername); } statisches Objekt GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; zurück Benutzer;
} Wenn wir einen anonymen Typ definieren, kann er nur durch den Objekttyp geleitet werden, und der Compiler kennt den tatsächlichen Typ des anonymen Typs nach dem Weitergeben nicht mehr.
Diese Linie kann mit der Cast-Erweiterungsmethode geworfen werden. Im Folgenden finden Sie einen Prototyp der Cast-Methode.
öffentliches statisches T-Guss (dieses Objekt o, T t) { Rückgabe ();
} 2. Wie erzeugt man eine anonyme Typliste für die föderierte Linq-Anfrage?
var User = GetAnonymous(). Cast(new { BenutzerName = "", LastLoginIp = "" }); var list = neue Liste< ?>(); Das Prinzip ist dasselbe wie oben.
var User = neu { BenutzerName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); Liste. Add(Benutzer); Console.Write(list[0]. Benutzername); Schauen wir uns die MakeList()-Methode an:
öffentliche statische Liste MakeList (this T t) { neue Liste zurückgeben();
} Natürlich denkst du vielleicht, dass die obige Methode nicht perfekt genug ist und du einen Benutzer zur Liste hinzufügen musst, sodass du folgende Methode hast:
öffentliche statische Liste MakeList (diese T t,params T[]-Elemente) { neue Liste (Gegenstände) zurückgeben; } Wenn aufgerufen, kann es geschrieben werden als:
var User = neu { BenutzerName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Benutzer.MakeList(Benutzer); Console.Write(list[0]. Benutzername); Diesmal kommen wir zur Sache und verstehen, wie die Linq-föderierte Abfrage implementiert ist.
var q = aus p in db. Produkte wobei p.Supplier.Country == "USA" && p.UnitsInStock == 0 Selectiere p; Die obige Abfrage besteht aus zwei verwandten Tabellen, und nur der Inhalt einer Tabelle wird zurückgegeben; in diesem Fall kann eine stark typisierte Liste in der Datenschicht zurückgegeben werden. Zum Beispiel:
öffentliche Liste SelectProducts() { var q = aus p in db. Produkte wobei p.Supplier.Country == "USA" && p.UnitsInStock == 0 Selectiere p; zurück q.ToList;
} Wenn die zurückgegebene Ergebnismenge mehr als zwei Tabellen enthält, wie sollte sie dann übergeben werden? Sie haben sicher gedacht, dass wir, wenn die zurückgegebene Ergebnismenge eine einzige Datenzeile ist, die zuvor erwähnte anonyme Lieferart verwenden können, um die benötigten Ergebnisse zu erhalten. Öffentlicher Zweck
öffentliches Objekt SelectProducts() { var q = aus p in db. Produkte wobei p.Supplier.Country == "USA" && p.UnitsInStock == 0 wählen Sie neue {p.UnitsInStock,p.Supplier.Sid} aus; var result = q. Einzel(); Rückgabeergebnis;
} Diese Prämisse besteht jedoch darin, dass die Geschäftslogikschicht die spezifischen Arten von Anonymitätstypen in der Datenschicht kennen muss. Diese Schichtung ist von geringer Bedeutung. Das ist nicht das, was wir wollen. Außerdem fehlschlug auch die Methode, den anonymen Listentyp zur Rückgabe der Ergebnismenge der mehrzeiligen Daten zurückzugeben, nach Experimenten fehl. Das bedeutet, dass keine der beiden Methoden zur Anonymität zu Beginn dieses Artikels funktionieren wird.
Methode 1: Die föderierte Abfrage von Linq passt Klassen mit derselben Struktur wie der Rückgabetyp an
öffentliche Klasse CustomQuery { public uint UnitsInStock { public uint { get; Set; } öffentliche Int Sid { get; Set; }
} Dies kann gelöst werden, wenn die Abfrageergebnisse eine Ergebnismenge mehrerer Tabellen sind. Da du wissen musst, welche Art der Anonymität zurückgegeben wird, musst du zusätzlich zur Nicht-Übereinstimmung mit der Multilayer eine zusätzliche Klasse definieren. Aber das stimmt und kann die Ergebnisse liefern, die wir brauchen, indem wir starke Typen verwenden.
Methode 2: Linq-föderierte Abfrage mittels System.Func-Delegation (Referenz: Zurückgabe von var aus einer Methode in C# 3.0)
Datenschicht:
public IEnumerable GetCustomersWithOrders(Func, TProjektion> Projektion) { Rückgabe vom Kunden in _customers let customerOrders = von der Bestellung in _orders Wo Ordnung. CustomerID = customer.ID Projection auswählen (Kunde, KundenAufträge);
} Geschäftslogik-Schicht:
var results = GetCustomersWithOrders( (Kunde, Bestellungen) => neu { Name = Kunde. Name, OrderCount = Befehle. Count() }); Das auf diese Weise zurückgegebene Ergebnis ist weiterhin ein echter anonymer Typ in der Geschäftslogikschicht und kann direkt verwendet werden.
Methode 3: Linq-föderierte Abfragen verwenden gespeicherte Prozeduren oder Views. |
Vorhergehend:LINQ bekommt das Problem mit gespeicherter Prozedur und Rückgabewert, mein gespeichertes ProzedurNächster:Microsoft gab IE auf und war entschlossen, 220.000 Zeilen Code zu erstellen
|