Šis straipsnis yra veidrodinis mašininio vertimo straipsnis, spauskite čia norėdami pereiti prie originalaus straipsnio.

Rodinys: 16456|Atsakyti: 0

[ASP.NET] Paaiškinkite Linq jungtinės užklausos lentelės rezultatų rinkinio grąžinimą

[Kopijuoti nuorodą]
Paskelbta 2015-05-08 16:34:23 | | |

Šiame straipsnyje autorius išsamiai pristato Linq bendrą užklausą, nes bijau, kad skaitytojai tiesiog nelabai supranta šį aspektą, todėl prieš kalbėdamas apie Linq bendrą užklausą, pirmiausia pateiksiu jums tam tikrų žinių, o tada pakalbėsiu apie tai, kaip įgyvendinama Linq bendra užklausa, tikėdamasis jums padėti.

Pirmiausia supraskime kai kuriuos Linq bendros užklausos žinių taškus.

1. Anoniminis pristatymo būdas



static void Main(string[] args)   
{ var User = GetAnonymous(). Cast(naujas { Vartotojo vardas = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
statinis objektas GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      grąžinti Vartotoją;     
}
Kai apibrėžiame anoniminį tipą, jis gali būti perduodamas tik per objekto tipą, o kompiliatorius nežinos tikrojo anoniminio tipo po perdavimo.

Šią liniją galima išlieti naudojant "Cast" pratęsimo metodą. Žemiau pateikiamas "Cast" metodo prototipas.



viešas statinis T Cast(šis objektas o, T t)      
{            
   grąžinti ();         
}
2. Kaip sugeneruoti anoniminį Linq federacinės užklausos tipų sąrašą?        



var User = GetAnonymous(). Cast(naujas { Vartotojo vardas = "", LastLoginIp = "" });         
var list = naujas sąrašas< ?>();
Principas yra tas pats, kaip ir aukščiau.



var Vartotojas = naujas   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
sąrašą. Pridėti (vartotojas);            
Console.Write(sąrašas[0]. UserName);
Pažvelkime į MakeList() metodą:



viešasis statinis sąrašas MakeList(this T t) {            
    grąžinti naują List();      
}
Žinoma, galite manyti, kad aukščiau pateiktas metodas nėra pakankamai tobulas, todėl turite įtraukti vartotoją į sąrašą, todėl turite šį metodą:      



viešasis statinis sąrašas MakeList(this T t,params T[] items)         
{            
   grąžinti naują sąrašą (elementus);   
}  
Kai skambinama, ji gali būti parašyta kaip:



var Vartotojas = naujas   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(Vartotojas);         
Console.Write(sąrašas[0]. UserName);   
Šį kartą pereikime prie gaudynių ir supraskime, kaip įgyvendinama Linq federacinė užklausa.



var q = nuo p db. Produktai     
kur p.Supplier.Country == "JAV" && p.UnitsInStock == 0   
pasirinkite p;
Aukščiau pateikta užklausa yra dvi susijusios lentelės ir grąžinamas tik vienos lentelės turinys, šiuo atveju duomenų sluoksnyje gali būti grąžintas stipriai įvestas sąrašas. Pavyzdžiui:



viešas sąrašas SelectProducts()   
{ var q = iš p db. Produktai     
       kur p.Supplier.Country == "JAV" && p.UnitsInStock == 0        
       pasirinkite p;        
       grąžinti q.ToList;   
}
Jei grąžintas rezultatų rinkinys yra daugiau nei dvi lentelės, kaip jis turėtų būti perduotas? Turbūt pagalvojote, kad jei grąžintas rezultatų rinkinys yra viena duomenų eilutė, galime naudoti anoniminį pristatymo tipą, kurį minėjome anksčiau, kad gautume reikiamus rezultatus. viešasis objektas



viešasis objektas SelectProducts()  
{ var q = iš p db. Produktai      
       kur p.Supplier.Country == "JAV" && p.UnitsInStock == 0        
       pasirinkite naują {p.UnitsInStock,p.Supplier.Sid};      var rezultatas = q.Single();  
       grąžinti rezultatą;   
}
Tačiau ši prielaida yra ta, kad verslo logikos sluoksnis turi žinoti konkrečius anonimiškumo tipus duomenų sluoksnyje. Šis sluoksniavimas neturi didelės reikšmės. Tai nėra tai, ko mes norime. Be to, po eksperimentų nepavyko naudoti anoniminio sąrašo tipo kelių eilučių duomenų rezultatų rinkiniui grąžinti. Tai reiškia, kad nė vienas iš dviejų anonimiškumo perdavimo būdų šio straipsnio pradžioje neveiks.

1 būdas: Linq federacinė užklausa tinkina klases, kurių struktūra yra tokia pati kaip grąžinimo tipas



viešoji klasė CustomQuery      
{ public uint UnitsInStock   
   { gauti; rinkinys; }            
  viešasis int Sid   
   { gauti; rinkinys; }        
}
Tai galima išspręsti, kai užklausos rezultatai yra kelių lentelių rezultatų rinkinys. Kadangi turite žinoti grąžinto anonimiškumo tipą, turite apibrėžti papildomą klasę, be to, kad ji neatitinka daugiasluoksnės. Bet tai tiesa ir gali grąžinti mums reikalingus rezultatus naudojant stiprius tipus.

2 būdas: Linq federacinė užklausa naudojant System.Func delegavimą (nuoroda: Grąžinamas var iš metodo C# 3.0)

Duomenų sluoksnis:



viešas IEnumerable GetCustomersWithOrders(Func,
Projekcija> projekcija)   
{ grąžinti iš kliento _customers           
     leisti customerOrders = iš užsakymo _orders                                
     kur užsakyti. Kliento ID = customer.ID            
     pasirinkti projekciją (klientas, klientasUžsakymai);  
}
Verslo logikos sluoksnis:



var results = GetCustomersWithOrders(  
(klientas, užsakymai) => naujas   
{ Vardas = klientas. Vardas, pavadinimas               
     OrderCount = užsakymai. Skaičius()        
});
Tokiu būdu grąžintas rezultatas vis dar yra tikras anoniminis tipas verslo logikos sluoksnyje ir gali būti naudojamas tiesiogiai.

3 būdas: "Linq" susietosios užklausos naudoja saugomas procedūras arba rodinius.




Ankstesnis:LINQ gauna saugomos procedūros grąžinimo vertės problemą mano saugoma procedūra
Kitą:"Microsoft" atsisakė IE ir buvo pasiryžusi sukurti 220 000 kodo eilučių
Atsakomybės apribojimas:
Visa programinė įranga, programavimo medžiaga ar straipsniai, kuriuos skelbia Code Farmer Network, yra skirti tik mokymosi ir mokslinių tyrimų tikslams; Aukščiau nurodytas turinys negali būti naudojamas komerciniais ar neteisėtais tikslais, priešingu atveju vartotojai prisiima visas pasekmes. Šioje svetainėje pateikiama informacija gaunama iš interneto, o ginčai dėl autorių teisių neturi nieko bendra su šia svetaine. Turite visiškai ištrinti aukščiau pateiktą turinį iš savo kompiuterio per 24 valandas nuo atsisiuntimo. Jei jums patinka programa, palaikykite autentišką programinę įrangą, įsigykite registraciją ir gaukite geresnes autentiškas paslaugas. Jei yra kokių nors pažeidimų, susisiekite su mumis el. paštu.

Mail To:help@itsvse.com