Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 16456|Atbildi: 0

[ASP.NET] Izskaidrot Linq federētās vaicājumu tabulas rezultātu kopas atgriešanu

[Kopēt saiti]
Publicēts 08.05.2015 16:34:23 | | |

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




Iepriekšējo:LINQ saņem saglabātās procedūras atgriešanas vērtības problēmu mana saglabātā procedūra
Nākamo:Microsoft pameta IE un bija apņēmusies veikt 220 000 koda rindiņas
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com