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