See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 16456|Vastuse: 0

[ASP.NET] Selgita Linqi föderatiivse päringutabeli tulemuste komplekti tagasitulekut

[Kopeeri link]
Postitatud 08.05.2015 16:34:23 | | |

Selles artiklis tutvustab autor Linqi ühispäringut põhjalikult, sest kardan, et lugejad ei mõista seda aspekti hästi, seega enne kui räägin Linqi ühistest päringutest, annan teile esmalt mõned teadmised ja seejärel räägin, kuidas Linqi ühispäringut rakendatakse, lootes teid aidata.

Kõigepealt mõistame mõningaid Linq ühise päringu teadmiste punkte.

1. Anonüümne kohaletoimetamise tüüp



staatiline tühjus Main(string[] args)   
{ var Kasutaja = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
staatiline objekt GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      naastav kasutaja;     
}
Kui määratleme anonüümse tüübi, saab selle edastada ainult objektitüübi kaudu ning kompilaator ei tea pärast üleminekut anonüümse tüübi tegelikku tüüpi.

Seda joont saab valada Cast-pikendamise meetodi abil. Allpool on Cast-meetodi prototüüp.



avalik staatiline T Cast (see objekt o, T t)      
{            
   return ();         
}
2. Kuidas genereerida anonüümset tüübilist Linq federated query jaoks?        



var Kasutaja = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = uus nimekiri< ?>();
Põhimõte on sama mis eelnevalt.



var Kasutaja = uus   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
nimekirjas. Add(User);            
Console.Write(list[0]. UserName);
Vaatame MakeList() meetodit:



avalik staatiline List MakeList (this T t) {            
    return new List();      
}
Muidugi võid arvata, et ülaltoodud meetod pole piisavalt täiuslik ja pead lisama kasutaja nimekirja, nii et sul on järgmine meetod:      



avalik staatiline nimekiri MakeList (see T t, parameetrid T[] esemed)         
{            
   tagasta uus nimekiri (esemed);   
}  
Kui seda kutsutakse, võib seda kirjutada järgmiselt:



var Kasutaja = uus   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList (Kasutaja);         
Console.Write(list[0]. UserName);   
Seekord läheme asja juurde ja mõistame, kuidas Linq federated query on rakendatud.



VAR q = P db-s. Tooted     
kus p.Supplier.Country == "USA" && p.UnitsInStock == 0   
vali p;
Ülaltoodud päring koosneb kahest omavahel seotud tabelist ning tagastatakse ainult ühe tabeli sisu, antud juhul saab andmekihis tagastada tugevalt tüübistatud loendi. Näiteks:



avalik nimekiri SelectProducts()   
{ var q = p hulgast db-s. Tooted     
       kus p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       vali p;        
       return q.ToList;   
}
Kui tagastatud tulemuste hulk on rohkem kui kaks tabelit, kuidas seda edasi anda? Sa oled ilmselt mõelnud, et kui tagastatud tulemuste hulk on üks andmerida, saame kasutada anonüümset edastust, mida varem mainisime, et saada vajalikud tulemused. Avalik objekt



avalik objekt SelectProducts()  
{ var q = p hulgast db-s. Tooted      
       kus p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       valida new {p.UnitsInStock,p.Supplier.Sid};      var tulemus = q.Single();  
       tagastustulemus;   
}
Kuid see eeldus on, et äriloogika kiht peab teadma konkreetseid anonüümsuse tüüpe andmekihis. See kihistamine on väheoluline. See pole see, mida me tahame. Lisaks ebaõnnestus anonüümse Listi tüübi kasutamine mitmerealiste andmete tulemuste tagastamiseks pärast katseid. See tähendab, et kumbki kahest anonüümsuse edastamise meetodist artikli alguses ei tööta.

Meetod 1: Linq federated query kohandab klasse, mille struktuur on sama mis tagastustüüp



public class CustomQuery      
{ avalik uint UnitsInStock   
   { get; seatud; }            
  public int Sid   
   { get; seatud; }        
}
Seda saab lahendada, kui päringu tulemused on mitmest tabelist koosnev tulemuste komplekt. Kuna pead teadma, millist anonüümsuse tüüp tagastatakse, tuleb lisaks sellele, et see ei vasta mitmekihilisele klassile, defineerima täiendava klassi. Kuid see on tõsi ja võib anda vajalikud tulemused tugevate tüüpide abil.

Meetod 2: Linq federated query kasutades System.Func delegeerimist (Viide: var tagastamine meetodist C# 3.0)

Andmekiht:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> projektsioon)   
{ tagasitulek kliendilt _customers           
     let customerOrders = tellimusest _orders                                
     kus kord. CustomerID = customer.ID            
     vali projektsioon (klient, customerOrders);  
}
Äriloogika kiht:



var results = GetCustomersWithOrders(  
(klient, tellimused) => uus   
{ Nimi = klient. Nimi               
     OrderCount = tellimused. Count()        
});
Sellisel viisil tagastatud tulemus on äriloogika kihis endiselt tõeline anonüümne tüüp ja seda saab otse kasutada.

Meetod 3: Linqi föderatiivsed päringud kasutavad salvestatud protseduure või vaateid.




Eelmine:LINQ saab salvestatud protseduuri tagastamise väärtuse probleemi minu salvestatud protseduuri
Järgmine:Microsoft loobus IE-st ja oli otsustanud teha 220 000 koodirida
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com