Acest articol este un articol oglindă al traducerii automate, vă rugăm să faceți clic aici pentru a sări la articolul original.

Vedere: 16943|Răspunde: 0

[ASP.NET] Explicați revenirea setului de rezultate al tabelului federat de interogări Linq

[Copiază linkul]
Postat pe 08.05.2015 16:34:23 | | |

Î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.




Precedent:LINQ primește procedura stocată problema returnării valorii
Următor:Microsoft a abandonat IE și a fost hotărât să facă 220.000 de linii de cod
Disclaimer:
Tot software-ul, materialele de programare sau articolele publicate de Code Farmer Network sunt destinate exclusiv scopurilor de învățare și cercetare; Conținutul de mai sus nu va fi folosit în scopuri comerciale sau ilegale, altfel utilizatorii vor suporta toate consecințele. Informațiile de pe acest site provin de pe Internet, iar disputele privind drepturile de autor nu au legătură cu acest site. Trebuie să ștergi complet conținutul de mai sus de pe calculatorul tău în termen de 24 de ore de la descărcare. Dacă îți place programul, te rugăm să susții software-ul autentic, să cumperi înregistrarea și să primești servicii autentice mai bune. Dacă există vreo încălcare, vă rugăm să ne contactați prin e-mail.

Mail To:help@itsvse.com