I denne artikel introducerer forfatteren Linq joint query i detaljer, fordi jeg er bange for, at læserne bare ikke forstår dette aspekt særlig godt, så før jeg taler om Linq joint query, vil jeg først give dig lidt viden og derefter tale om, hvordan Linq joint query implementeres, i håb om at hjælpe dig.
Lad os først forstå nogle videnspunkter i Linqs fælles forespørgsel.
1. Anonym leveringstype
statisk void Main(string[] args) { var User = GetAnonymous(). Cast(new { Brugernavn = "", LastLoginIp = "" }); Console.Write(Bruger.Brugernavn); } statisk objekt GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; returner Bruger;
} Når vi definerer en anonym type, kan den kun sendes gennem objekttypen, og compileren vil ikke kende den faktiske type af den anonyme type efter at have passeret.
Denne linje kan kastes gennem Cast extension-metoden. Nedenfor er en prototype af Cast-metoden.
offentlig statisk T-kast (dette objekt o, T t) { returner ();
} 2. Hvordan genererer man en anonym typeliste til Linq-fødereret forespørgsel?
var User = GetAnonymous(). Cast(new { Brugernavn = "", LastLoginIp = "" }); var list = ny liste< ?>(); Princippet er det samme som ovenfor.
var User = ny { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); liste. Tilføj (Bruger); Console.Write(list[0]. Brugernavn); Lad os se på MakeList()-metoden:
offentlig statisk List MakeList (this T t) { returner ny liste();
} Selvfølgelig tænker du måske, at ovenstående metode ikke er perfekt nok, og at du skal tilføje en bruger til listen, så du har følgende metode:
offentlig statisk Liste MakeList (denne T t,params T[] elementer) { returnere ny liste(varer); } Når den kaldes, kan den skrives som:
var User = ny { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = Bruger.MakeList(Bruger); Console.Write(list[0]. Brugernavn); Denne gang skal vi komme til sagen og forstå, hvordan Linqs federerede forespørgsel er implementeret.
var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnhederPå lager == 0 vælg p; Ovenstående forespørgsel er to relaterede tabeller, og kun indholdet af én tabel returneres; i dette tilfælde kan en stærkt typet Liste returneres i datalaget. For eksempel:
offentlig liste SelectProducts() { var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnhederPå lager == 0 vælg p; returner q.ToList;
} Hvis det returnerede resultatsæt er mere end to tabeller, hvordan skal det så videregives? Du må have tænkt, at hvis det resultatsæt, der returneres, er en enkelt linje data, kan vi bruge den anonyme leveringstype, vi nævnte tidligere, for at få de resultater, vi har brug for. Offentligt formål
offentligt objekt SelectProducts() { var q = fra p i db. Produkter hvor p.Leverandør.Land == "USA" && p.EnhederPå lager == 0 vælg nye {p.UnitsInStock,p.Supplier.Sid}; var resultat = q. Enkelt(); returneringsresultat;
} Denne forudsætning er dog, at forretningslogiklaget skal kende de specifikke typer anonymitetstyper i datalaget. Denne lagdeling er af ringe betydning. Det er ikke det, vi ønsker. Desuden fejlede metoden med at bruge den anonyme listetype til at returnere resultatsættet af fler-række data også efter eksperimenter. Det betyder, at ingen af de to metoder til at overføre anonymitet i begyndelsen af denne artikel vil virke.
Metode 1: Linq federated query tilpasser klasser med samme struktur som returtypen
offentlig klasse CustomQuery { public uint UnitsInStock { get; sat; } offentlig int Sid { get; sat; }
} Dette kan løses, når forespørgselsresultaterne er et resultatsæt af flere tabeller. Da du skal kende typen af anonymitet, der returneres, skal du definere en ekstra klasse ud over ikke at overholde multilaget. Men det er sandt og kan give de resultater, vi har brug for, ved hjælp af stærke typer.
Metode 2: Linq-fødereret forespørgsel ved brug af System.Func-delegering (Reference: Tilbagevenden af var fra en metode i C# 3.0)
Datalag:
public IEnumerable GetCustomersWithOrders(Func, TProjektion> projektion) { returnering fra kunde i _customers let customerOrders = fra ordre i _orders hvor orden. CustomerID = customer.ID vælg projektion(kunde, kundeOrdrer);
} Forretningslogiklag:
var results = GetCustomersWithOrders( (kunde, ordrer) => ny { Navn = kunde. Navn OrderCount = ordrer. Count() }); Resultatet, der returneres på denne måde, er stadig en ægte anonym type i forretningslogiklaget og kan bruges direkte.
Metode 3: Linq-fødererede forespørgsler bruger lagrede procedurer eller visninger. |