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