Dit artikel is een spiegelartikel van machinevertaling, klik hier om naar het oorspronkelijke artikel te gaan.

Bekijken: 16456|Antwoord: 0

[ASP.NET] Leg de terugkeer uit van de Linq federated query table resultaatset

[Link kopiëren]
Geplaatst op 08-05-2015 16:34:23 | | |

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.




Vorig:LINQ krijgt een stored procedure return value probleem van mijn stored procedure
Volgend:Microsoft liet IE varen en was vastbesloten om 220.000 regels code te maken
Disclaimer:
Alle software, programmeermaterialen of artikelen die door Code Farmer Network worden gepubliceerd, zijn uitsluitend bedoeld voor leer- en onderzoeksdoeleinden; De bovenstaande inhoud mag niet worden gebruikt voor commerciële of illegale doeleinden, anders dragen gebruikers alle gevolgen. De informatie op deze site komt van het internet, en auteursrechtconflicten hebben niets met deze site te maken. Je moet bovenstaande inhoud volledig van je computer verwijderen binnen 24 uur na het downloaden. Als je het programma leuk vindt, steun dan de echte software, koop registratie en krijg betere echte diensten. Als er sprake is van een inbreuk, neem dan contact met ons op via e-mail.

Mail To:help@itsvse.com