În acest articol, autorul introduce în detaliu interogarea comună Linq, deoarece mă tem că cititorii pur și simplu nu înțeleg foarte bine acest aspect, așa că, înainte de a vorbi despre interogarea comună Linq, voi oferi mai întâi câteva cunoștințe, apoi voi discuta despre modul în care este implementată interogarea comună Linq, sperând să vă ajut.
Mai întâi, să înțelegem câteva puncte de cunoaștere ale interogării comune Linq.
1. Tip anonim de livrare
static void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } obiect static GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; returnează utilizatorul;
} Când definim un tip anonim, acesta poate fi transmis doar prin tipul obiect, iar compilatorul nu va ști tipul real al tipului anonim după ce a trecut.
Această linie poate fi proiectată prin metoda de extensie Cast. Mai jos este un prototip al metodei Cast.
public static T Cast (acest obiect o, T t) { întoarcerea ();
} 2. Cum se generează o listă de tipuri anonime pentru interogarea federată Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = Listă nouă< ?>(); Principiul este același ca cel de mai sus.
var User = nou { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); listă. Adaugă (Utilizator); Console.Write(list[0]. NumeUtilizator); Să aruncăm o privire la metoda MakeList():
public static List MakeList(this T t) { returnează noul List();
} Desigur, s-ar putea să crezi că metoda de mai sus nu este suficient de perfectă și trebuie să adaugi un utilizator în listă, astfel încât ai următoarea metodă:
Public static List MakeList(this T t, params T[] elemente) { returnează noi Liste(elemente); } Când este apelat, poate fi scris astfel:
var User = nou { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. NumeUtilizator); De data aceasta, să trecem la subiect și să înțelegem cum este implementată interogarea federată Linq.
var q = de la p în db. Produse unde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selectează p; Interogarea de mai sus este formată din două tabele înrudite, iar doar conținutul unui tabel este returnat, în acest caz, o Listă puternic tipată poate fi returnată în stratul de date. De exemplu:
Listă publică SelectProducts() { var q = de la p în db. Produse unde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selectează p; returnează q.ToList;
} Dacă setul de rezultate returnat este mai mare de două tabele, cum ar trebui să fie trecut? Probabil te-ai gândit că, dacă setul de rezultate returnat este o singură linie de date, putem folosi tipul anonim de livrare menționat anterior pentru a obține rezultatele de care avem nevoie. Obiect public
obiect public SelectProducts() { var q = de la p în db. Produse unde p.Supplier.Country == "USA" & p.UnitsInStock == 0 selectează noul {p.UnitsInStock,p.Supplier.Sid}; rezultat var = q.Single(); rezultatul returnării;
} Totuși, această premisă este că stratul de logică de afaceri trebuie să cunoască tipurile specifice de anonimat din stratul de date. Această stratificare are puțină importanță. Asta nu este ceea ce ne dorim. Mai mult, metoda de a folosi tipul anonim List pentru a returna setul de rezultate cu date pe mai multe rânduri a eșuat de asemenea după experimente. Aceasta înseamnă că niciuna dintre cele două metode de a trece prin anonimat la începutul acestui articol nu va funcționa.
Metoda 1: Interogarea federată Linq personalizează clasele cu aceeași structură ca tipul de returnare
clasa publică CustomQuery { public uint UnitsInStock { get; set; } public int Sid { get; set; }
} Acest lucru poate fi rezolvat atunci când rezultatele interogării sunt un set de rezultate format din mai multe tabele. Deoarece trebuie să știi tipul de anonimat returnat, trebuie să definești o clasă suplimentară pe lângă faptul că nu se conformează cu multistratul. Dar acest lucru este adevărat și poate returna rezultatele de care avem nevoie folosind tipuri puternice.
Metoda 2: Interogare federată Linq folosind delegarea System.Func (Referință: Revenirea varului dintr-o metodă din C# 3.0)
Stratul de date:
public IEnumerabil GetCustomersWithOrders(Func, TProjection> proiecție) { retur de la client în _customers să fie customerOrders = din comandă în _orders Unde ordinea. CustomerID = customer.ID proiecție selectă (client, clientComenzi);
} Strat de logică de afaceri:
var results = GetCustomersWithOrders( (client, comenzi) => nou { Nume = client. Nume OrderCount = comenzi. Conte() }); Rezultatul returnat în acest mod rămâne un tip anonim adevărat în stratul logicii de afaceri și poate fi folosit direct.
Metoda 3: Interogările federate Linq folosesc proceduri stocate sau vizualizări. |