I denne artikkelen introduserer forfatteren Linq joint query i detalj, fordi jeg er redd for at leserne ikke forstår dette aspektet så godt, så før jeg snakker om Linq joint query, vil jeg først legge frem litt kunnskap for deg, og deretter snakke om hvordan Linq joint query implementeres, i håp om å hjelpe deg.
La oss først forstå noen kunnskapspunkter i Linqs felles spørring.
1. Anonym leveringstype
statisk void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(Bruker.Brukernavn); } statisk objekt GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; returner Bruker;
} Når vi definerer en anonym type, kan den bare sendes gjennom objekttypen, og kompilatoren vil ikke vite den faktiske typen til den anonyme typen etter å ha passert.
Denne linjen kan støpes gjennom Cast extension-metoden. Nedenfor er en prototype av Cast-metoden.
offentlig statisk T-kast (dette objektet o, T t) { returnere ();
} 2. Hvordan generere en anonym typeliste for Linq-føderert spørring?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = ny liste< ?>(); Prinsippet er det samme som ovenfor.
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); liste. Legg til (bruker); Console.Write(list[0]. UserName); La oss ta en titt på MakeList()-metoden:
offentlig statisk List MakeList (denne T t) { returner ny liste();
} Selvfølgelig kan du tenke at metoden ovenfor ikke er perfekt nok, og at du må legge til en bruker i listen, så du har følgende metode:
offentlig statisk ListeMakeList (denne T t,params T[]-elementer) { returnere ny liste (varer); } Når den kalles opp, kan den skrives som:
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Bruker.MakeList(Bruker); Console.Write(list[0]. UserName); Denne gangen, la oss gå rett på sak og forstå hvordan Linqs fødererte spørring er implementert.
var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnheterPå lager == 0 velg p; Spørringen ovenfor er to relaterte tabeller, og kun innholdet i én tabell returneres; i dette tilfellet kan en sterkt typet Liste returneres i datalaget. For eksempel:
offentlig liste SelectProducts() { var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnheterPå lager == 0 velg p; returner q.ToList;
} Hvis det returnerte resultatsettet er mer enn to tabeller, hvordan skal det overføres? Du må ha tenkt at hvis resultatsettet som returneres er en enkelt linje med data, kan vi bruke den anonyme leveringstypen vi nevnte tidligere for å få de resultatene vi trenger. Offentlig formål
offentlig objekt SelectProducts() { var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnheterPå lager == 0 velg nye {p.UnitsInStock,p.Supplier.Sid}; var-resultat = q. Enkelt(); returresultat;
} Dette premisset er imidlertid at forretningslogikklaget må kjenne til de spesifikke typene anonymitetstyper i datalaget. Denne lagdelingen har liten betydning. Dette er ikke det vi ønsker. Dessuten feilet metoden med å bruke anonym listetype for å returnere resultatsettet med flerradsdata også etter eksperimenter. Dette betyr at ingen av de to metodene for å overføre anonymitet i begynnelsen av denne artikkelen vil fungere.
Metode 1: Linq føderert spørring tilpasser klasser med samme struktur som returtypen
offentlig klasse CustomQuery { offentlig uint UnitsInStock { get; sett; } offentlig int Sid { get; sett; }
} Dette kan løses når spørringsresultatene er et resultatsett av flere tabeller. Siden du må vite hvilken type anonymitet som returneres, må du definere en ekstra klasse i tillegg til å ikke følge multilaget. Men dette er sant og kan gi de resultatene vi trenger ved å bruke sterke typer.
Metode 2: Linq-føderert spørring ved bruk av System.Func-delegering (Referanse: Returnerer var fra en metode i C# 3.0)
Datalag:
offentlig IEnumerable GetCustomersWithOrders(Func, TProjeksjon> projeksjon) { retur fra kunde i _customers la customerOrders = fra ordre i _orders hvor rekkefølge. CustomerID = customer.ID velg projeksjon (kunde, kundeOrdrer);
} Forretningslogikklag:
var results = GetCustomersWithOrders( (kunde, bestillinger) => ny { Navn = kunde. Navn OrderCount = bestillinger. Tell() }); Resultatet som returneres på denne måten er fortsatt en ekte anonym type i forretningslogikklaget og kan brukes direkte.
Metode 3: Linq-fødererte spørringer bruker lagrede prosedyrer eller visninger. |