V tem članku avtor podrobno predstavi Linq skupno poizvedbo, ker se bojim, da bralci tega vidika ne razumejo dobro, zato bom pred pogovorom o Linq skupnih poizvedbah najprej predstavil nekaj znanja, nato pa o tem, kako je Linq skupna poizvedba implementirana, v upanju, da vam bom pomagal.
Najprej si oglejmo nekaj vidikov znanja o Linq skupnem poizvedbnem sistemu.
1. Anonimna vrsta dostave
static void Main (string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(uporabniško.uporabniško-ime); } statični objekt GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; return User;
} Ko definiramo anonimni tip, ga lahko posredujemo le skozi objektni tip, prevajalnik pa po prenosu ne bo poznal dejanskega tipa anonimnega tipa.
To vrvico je mogoče uliti z metodo podaljševanja. Spodaj je prototip metode Cast.
javni statični T Cast (ta objekt o, T t) { return ();
} 2. Kako ustvariti anonimni seznam tipov za Linq federirano poizvedbo?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = nov seznam< ?>(); Načelo je enako kot zgoraj.
var User = nov { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); seznam. Add(User); Console.write(list[0]. Uporabniško ime); Poglejmo si metodo MakeList():
javni statični List MakeList(this T t) { vrni nov List();
} Seveda morda menite, da zgornja metoda ni dovolj popolna in da morate na seznam dodati uporabnika, zato imate naslednjo metodo:
javni statični seznam MakeList (ta T t,parametri T[] elementi) { vrni nov seznam(elemente); } Ko ga pokličemo, ga lahko zapišemo kot:
var User = nov { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.write(list[0]. Uporabniško ime); Tokrat pa se lotimo bistva in poglejmo, kako je Linq federirana poizvedba implementirana.
var q = iz p v db. Izdelki kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0 Izberite P; Zgornja poizvedba sta dve povezani tabeli, pri čemer se vrne le vsebina ene tabele; v tem primeru je mogoče v podatkovni plasti vrniti močno tipiziran seznam. Na primer:
javni seznam SelectProducts() { var q = iz p v db. Izdelki kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0 Izberite P; vrni q.ToList;
} Če je vrnjeni niz rezultatov več kot dve tabeli, kako naj se prenese? Verjetno ste mislili, da če je vrnjeni nabor rezultatov ena sama vrstica podatkov, lahko uporabimo anonimno vrsto dostave, ki smo jo omenili prej, da dobimo potrebne rezultate. Javni objekt
javni objekt SelectProducts() { var q = iz p v db. Izdelki kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0 izberite novo {p.UnitsInStock,p.Supplier.Sid}; var result = q.Single(); vrni rezultat;
} Vendar pa je predpostavka, da mora poslovna logična plast poznati specifične vrste anonimnih vrst v podatkovni plasti. To plastenje nima velikega pomena. To ni tisto, kar si želimo. Poleg tega je metoda uporabe anonimnega tipa List za vračanje rezultatov večvrstičnih podatkov po eksperimentih prav tako odpovedala. To pomeni, da nobena od dveh metod za ohranjanje anonimnosti na začetku tega članka ne bo delovala.
Metoda 1: Linq federirana poizvedba prilagaja razrede z enako strukturo kot tip vrnitve
javni razred CustomQuery { public uint UnitsInStock { get; set; } javno int Sid { get; set; }
} To je mogoče rešiti, ko so rezultati poizvedb množica rezultatov več tabel. Ker morate vedeti, kakšna anonimnost se vrne, morate poleg večplastnosti definirati še dodatno razred. A to drži in lahko prinese potrebne rezultate z močnimi tipi.
Metoda 2: Linq federirana poizvedba z uporabo delegacije System.Func (Referenca: Vračanje var iz metode v C# 3.0)
Podatkovna plast:
public IEnumerable GetCustomersWithOrders(Func, TProjection> projekcija) { vračilo od stranke v _customers naj customerOrders = iz naročila v _orders kjer red. CustomerID = customer.ID izberite projekcijo(stranka, naročila stranke);
} Plast poslovne logike:
var results = GetCustomersWithOrders( (kupec, naročila) => novo { Ime = stranka. Ime OrderCount = naročila. Count() }); Rezultat, ki se vrne na ta način, je še vedno pravi anonimni tip v plasti poslovne logike in ga je mogoče uporabiti neposredno.
Metoda 3: Linq federirane poizvedbe uporabljajo shranjene postopke ali poglede. |