Šajā rakstā autors detalizēti iepazīstina ar Linq kopīgo vaicājumu, jo es baidos, ka lasītāji vienkārši nesaprot šo aspektu ļoti labi, tāpēc pirms runāt par Linq kopīgo vaicājumu, es vispirms jums ielikšu dažas zināšanas un pēc tam runāšu par to, kā tiek īstenots Linq kopīgais vaicājums, cerot jums palīdzēt.
Pirmkārt, sapratīsim dažus Linq kopīgā vaicājuma zināšanu punktus.
1. Anonīms piegādes veids
statisks tukšums Main(virkne[] argumenti) { var Lietotājs = GetAnonymous(). Cast(jauns { Lietotājvārds = "", LastLoginIp = "" }); Console.Write(Lietotāja.Lietotājvārds); } statiskais objekts GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; atgriezties Lietotājs;
} Kad mēs definējam anonīmu tipu, to var nodot tikai caur objekta tipu, un kompilators pēc nodošanas nezinās anonīmā tipa faktisko tipu.
Šo līniju var izliet, izmantojot Cast paplašināšanas metodi. Zemāk ir Cast metodes prototips.
publiskais statiskais T Cast(šis objekts o, T t) { atgriešanās ();
} 2. Kā izveidot anonīmu tipu sarakstu Linq federētajam vaicājumam?
var Lietotājs = GetAnonymous(). Cast(jauns { Lietotājvārds = "", LastLoginIp = "" }); var list = jauns saraksts< ?>(); Princips ir tāds pats kā iepriekš.
var Lietotājs = jauns { Lietotājvārds = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Lietotājs.MakeList(); saraksts. Pievienot (lietotājs); Console.Write(saraksts[0]. Lietotājvārds); Apskatīsim MakeList() metodi:
publiskais statiskais saraksts MakeList(šis T t) { atgriezt jaunu List();
} Protams, jūs domājat, ka iepriekš minētā metode nav pietiekami ideāla, un jums ir jāpievieno lietotājs sarakstam, tāpēc jums ir šāda metode:
publiskais statiskais saraksts MakeList(šis T t,params T[] vienumi) { atgriezt jaunu sarakstu (vienumus); } Izsaucot, to var rakstīt kā:
var Lietotājs = jauns { Lietotājvārds = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Lietotājs.MakeList(Lietotājs); Console.Write(saraksts[0]. Lietotājvārds); Šoreiz ķeramies pie pakaļdzīšanās un sapratīsim, kā tiek īstenots Linq federatīvais vaicājums.
var q = no p db. Produkti kur p.Supplier.Country == "ASV" && p.UnitsInStock == 0 atlasiet p; Iepriekš minētais vaicājums ir divas saistītas tabulas, un tiek atgriezts tikai vienas tabulas saturs, šajā gadījumā datu slānī var atgriezt stipri ierakstītu sarakstu. Piemēram:
publiskais saraksts SelectProducts() { var q = no p db. Produkti kur p.Supplier.Country == "ASV" && p.UnitsInStock == 0 atlasiet p; atgriezt q.ToList;
} Ja atgrieztais rezultātu kopums ir vairāk nekā divas tabulas, kā tas ir jānokārto? Jūs noteikti domājāt, ka, ja atgrieztā rezultātu kopa ir viena datu rinda, mēs varam izmantot anonīmo piegādes veidu, ko mēs pieminējām iepriekš, lai iegūtu nepieciešamos rezultātus. Publisks objekts
publiskais objekts SelectProducts() { var q = no p db. Produkti kur p.Supplier.Country == "ASV" && p.UnitsInStock == 0 atlasiet jaunu {p.UnitsInStock,p.Supplier.Sid}; var rezultāts = q.Single(); atgriezt rezultātu;
} Tomēr šis priekšnoteikums ir tāds, ka biznesa loģikas slānim ir jāzina konkrēti anonimitātes tipu veidi datu slānī. Šim slāņojumam ir maza nozīme. Tas nav tas, ko mēs gribam. Turklāt pēc eksperimentiem neizdevās izmantot anonīmo saraksta tipu, lai atgrieztu vairāku rindu datu rezultātu kopu. Tas nozīmē, ka neviena no divām anonimitātes nodošanas metodēm šī raksta sākumā nedarbosies.
1. metode: Linq federatīvais vaicājums pielāgo klases ar tādu pašu struktūru kā atgriešanās tips
publiskā klase CustomQuery { public uint UnitsInStock { iegūt; komplekts; } publiskais int Sid { iegūt; komplekts; }
} To var novērst, ja vaicājuma rezultāti ir vairāku tabulu rezultātu kopa. Tā kā jums ir jāzina atgrieztās anonimitātes veids, jums ir jādefinē papildu klase papildus neatbilstībai daudzslāņu. Bet tas ir taisnība un var atgriezt vajadzīgos rezultātus, izmantojot spēcīgus tipus.
2. metode: Linq federatīvais vaicājums, izmantojot System.Func deleģēšanu (Atsauce: Atgriešanās var no metodes C# 3.0)
Datu slānis:
public IEnumerable GetCustomersWithOrders(Func, Projekcija> projekcija) { atgriešanās no klienta _customers ļaut customerOrders = no pasūtījuma _orders kur pasūtījums. Klienta ID = customer.ID izvēlieties projekciju (klients, klientsPasūtījumi);
} Biznesa loģikas slānis:
var results = GetCustomersWithOrders( (klients, pasūtījumi) => jauns { Vārds = klients. Vārds OrderCount = pasūtījumi. Skaits() }); Šādā veidā atgrieztais rezultāts joprojām ir patiess anonīms tips biznesa loģikas slānī, un to var izmantot tieši.
3. metode: Linq federatīvie vaicājumi izmanto saglabātās procedūras vai skatus. |