In dit artikel introduceert de auteur de Linq joint query in detail, omdat ik bang ben dat lezers dit aspect gewoon niet goed begrijpen, dus voordat ik het over de Linq joint query heb, zal ik eerst wat kennis voor je leggen en daarna uitleggen hoe de Linq joint query wordt geïmplementeerd, in de hoop je te kunnen helpen.
Laten we eerst enkele kennispunten van de Linq-gezamenlijke query begrijpen.
1. Anonieme vorm van levering
statische void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(Gebruiker.Gebruikersnaam); } statisch object GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; return User;
} Wanneer we een anoniem type definiëren, kan het alleen door het objecttype worden gestuurd, en de compiler zal het daadwerkelijke type van het anonieme type niet kennen na het passeren.
Deze lijn kan worden geworpen via de Cast extension-methode. Hieronder staat een prototype van de Cast-methode.
publieke statische T-cast (dit object o, T t) { return ();
} 2. Hoe genereer je een anonieme typelijst voor een gefedereerde Linq-query?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = nieuwe Lijst< ?>(); Het principe is hetzelfde als hierboven.
var User = nieuw { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); lijst. Add(Gebruiker); Console.Write(list[0]. UserName); Laten we eens kijken naar de MakeList()-methode:
publieke statische Lijst MakeList (dit T t) { geef nieuwe Lijst terug();
} Natuurlijk denk je misschien dat bovenstaande methode niet perfect genoeg is, en dat je een gebruiker aan de Lijst moet toevoegen, dus heb je de volgende methode:
publieke statische Lijst MakeList (deze T t, params T[] items) { nieuwe Lijst (items) terugbrengen; } Wanneer het wordt aangeroepen, kan het worden geschreven als:
var User = nieuw { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. UserName); Laten we deze keer ter zake komen en begrijpen hoe Linq federated query wordt geïmplementeerd.
var q = van p in db. Producten waarbij p.Leverancier.Land == "VS" && p.EenhedenInVoorraad == 0 selecteer p; De bovenstaande query bestaat uit twee gerelateerde tabellen, en slechts de inhoud van één tabel wordt teruggegeven; in dit geval kan een sterk getypeerde lijst in de datalaag worden teruggegeven. Bijvoorbeeld:
publieke lijst SelectProducts() { var q = van p in db. Producten waarbij p.Leverancier.Land == "VS" && p.EenhedenInVoorraad == 0 selecteer p; return q.ToList;
} Als de geretourneerde resultaatset meer dan twee tabellen bevat, hoe moet deze dan worden doorgegeven? Je hebt vast gedacht dat als de resultaatset die wordt teruggegeven een enkele regel data is, we het anonieme type levering kunnen gebruiken dat we eerder noemden om de gewenste resultaten te krijgen. Publiek doel
publiek object SelectProducts() { var q = van p in db. Producten waarbij p.Leverancier.Land == "VS" && p.EenhedenInVoorraad == 0 selecteer nieuwe {p.UnitsInStock,p.Supplier.Sid}; var-resultaat = q.Enkel(); retourresultaat;
} Deze premisse is echter dat de business logica-laag de specifieke typen anonimiteitstypen in de datalaag moet kennen. Deze lagen zijn van weinig betekenis. Dit is niet wat we willen. Bovendien faalde de methode om het anonieme lijsttype te gebruiken om de resultaatset van meerrijige gegevens terug te geven na experimenten. Dit betekent dat geen van de twee methoden om anonimiteit aan het begin van dit artikel te overbrengen zal werken.
Methode 1: Linq federated query past klassen aan met dezelfde structuur als het returntype
publieke klasse CustomQuery { public uint UnitsInStock { get; set; } publieke int Sid { get; set; }
} Dit kan worden opgelost wanneer de zoekresultaten een resultaatset van meerdere tabellen zijn. Omdat je moet weten welk type anonimiteit wordt teruggegeven, moet je naast het niet conformeren van de multilayer ook een extra klasse definiëren. Maar dit is waar en kan de resultaten opleveren die we nodig hebben met sterke types.
Methode 2: Linq federated query met System.Func delegatie (Referentie: Var teruggeven van een methode in C# 3.0)
Datalaag:
publieke IEnumerable GetCustomersWithOrders(Func, TProjektie> projectie) { retour van klant in _customers let customerOrders = van order in _orders waar orde. CustomerID = customer.ID selecteer projectie(klant, klantOrders);
} Laag van bedrijfslogica:
var results = GetCustomersWithOrders( (klant, bestellingen) => nieuw { Naam = klant. Naam, OrderCount = orders. Count() }); Het resultaat dat op deze manier wordt teruggegeven, is nog steeds een echt anoniem type in de bedrijfslogicalaag en kan direct worden gebruikt.
Methode 3: Linq federated queries gebruiken stored procedures of views. |