Tässä artikkelissa kirjoittaja esittelee Linq joint queryn yksityiskohtaisesti, koska pelkään, etteivät lukijat ymmärrä tätä osa-aluetta kovin hyvin, joten ennen kuin puhun Linq joint querysta, kerron ensin hieman tietoa teille ja sitten kerron, miten Linq joint query toteutetaan, toivoen voivani auttaa teitä.
Ensiksi ymmärretään joitakin Linq-yhteiskyselyn tietopisteitä.
1. Anonyymi toimitustyyppi
staattinen void Pää(merkkijono[] args) { var Käyttäjä = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } staattinen objekti GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; return User;
} Kun määrittelemme anonyymin tyypin, se voidaan välittää vain objektityypin kautta, eikä kääntäjä tiedä anonyymin tyypin todellista tyyppiä syötön jälkeen.
Tämä viiva voidaan heittää Cast-laajennusmenetelmällä. Alla on prototyyppi Cast-menetelmästä.
julkinen staattinen T Cast (tämä objekti o, T t) { paluu ();
} 2. Kuinka luoda anonyymi tyyppilista Linq federated querylle?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = uusi lista< ?>(); Periaate on sama kuin yllä.
var Käyttäjä = uusi { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); lista. add(User); Console.Write(list[0]. UserName); Katsotaanpa MakeList()-menetelmää:
julkinen staattinen lista MakeList (this T t) { return new List();
} Tietenkin saatat ajatella, että yllä oleva menetelmä ei ole tarpeeksi täydellinen, ja sinun täytyy lisätä käyttäjä listalle, joten sinulla on seuraava menetelmä:
julkinen staattinen lista MakeList (tämä T t, parametrit T[] esineet) { palauttaa uusi lista (esineet); } Kun sitä kutsutaan, se voidaan kirjoittaa näin:
var Käyttäjä = uusi { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList (Käyttäjä); Console.Write(list[0]. UserName); Tällä kertaa mennään suoraan asiaan ja ymmärretään, miten Linq federated query on toteutettu.
VAR q = pisteestä p db:ssä. Tuotteet missä p.Supplier.Country == "USA" && p.UnitsInStock == 0 valitse p; Yllä oleva kysely koostuu kahdesta toisiinsa liittyvästä taulusta, ja palautetaan vain yhden taulun sisältö; tässä tapauksessa vahvasti tyypitetyn listan voi palauttaa datakerrokseen. Esimerkiksi:
julkinen lista SelectProducts() { var q = p:stä db:ssä. Tuotteet missä p.Supplier.Country == "USA" && p.UnitsInStock == 0 valitse p; return q.ToList;
} Jos palautettu tulosjoukko on enemmän kuin kaksi taulukkoa, miten se tulisi ohittaa? Olet varmasti ajatellut, että jos palautettu tulosjoukko on yksi datarivi, voimme käyttää aiemmin mainitsemaamme anonyymiä toimitustapoja saadaksemme tarvitsemamme tulokset. Julkinen kohde
julkinen objekti SelectProducts() { var q = p:stä db:ssä. Tuotteet missä p.Supplier.Country == "USA" && p.UnitsInStock == 0 valitse new {p.UnitsInStock,p.Supplier.Sid}; var result = q.Single(); palautustulos;
} Tämä oletus kuitenkin on, että liiketoimintalogiikkakerroksen täytyy tuntea tietyt anonymiteetityypit datakerroksessa. Tämä kerrostaminen on vähäpätöistä. Tämä ei ole sitä, mitä haluamme. Lisäksi anonyymin listatyypin käyttö monirivisten tietojen tulosaineiston palauttamiseksi epäonnistui kokeiden jälkeen. Tämä tarkoittaa, että kumpikaan tämän artikkelin alussa mainituista anonymiteetin välittämistavoista ei toimi.
Menetelmä 1: Linq federated query räätälöi luokkia, joiden rakenne on sama kuin palautustyyppi
public class CustomQuery { julkinen uint UnitsInStock { saa; setti; } julkinen int Sid { saa; setti; }
} Tämä voidaan ratkaista, kun kyselytulokset ovat useiden taulujen tulosjoukko. Koska sinun täytyy tietää palautetun anonymiteetin tyyppi, sinun täytyy määritellä lisäluokka monikerroksisen lisäksi. Mutta tämä pitää paikkansa, ja voi tuottaa tarvitsemamme tulokset vahvoilla tyypeillä.
Menetelmä 2: Linqin liittoutunut kysely käyttäen System.Func-delegointia (Lähde: Varin palauttaminen metodista C# 3.0:ssa)
Tietokerros:
public IEnumerable GetCustomersWithOrders(Func, TProjection> projektio) { paluu asiakkaalta _customers let customerOrders = tilauksesta _orders missä järjestyksessä. CustomerID = customer.ID valitse projektio (asiakas, asiakasTilaukset);
} Liiketoimintalogiikkakerros:
var results = GetCustomersWithOrders( (asiakas, tilaukset) => uusi { Nimi = asiakas. Nimi OrderCount = tilaukset. Count() }); Tällä tavalla palautettu tulos on edelleen aito anonyymi tyyppi liiketoimintalogiikkakerroksessa ja sitä voidaan käyttää suoraan.
Menetelmä 3: Linqin liittoutuneet kyselyt käyttävät tallennettuja proseduureja tai näkymiä. |