Denne artikel er en spejling af maskinoversættelse, klik venligst her for at springe til den oprindelige artikel.

Udsigt: 16456|Svar: 0

[ASP.NET] Forklar returen af Linqs fødererede forespørgselstabel resultatsæt

[Kopier link]
Opslået på 08/05/2015 16.34.23 | | |

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.




Tidligere:LINQ får problemet med lagret procedure, return-værdi min stored procedure
Næste:Microsoft opgav IE og var fast besluttet på at lave 220.000 linjer kode
Ansvarsfraskrivelse:
Al software, programmeringsmaterialer eller artikler udgivet af Code Farmer Network er kun til lærings- og forskningsformål; Ovenstående indhold må ikke bruges til kommercielle eller ulovlige formål, ellers skal brugerne bære alle konsekvenser. Oplysningerne på dette site kommer fra internettet, og ophavsretstvister har intet med dette site at gøre. Du skal slette ovenstående indhold fuldstændigt fra din computer inden for 24 timer efter download. Hvis du kan lide programmet, så understøt venligst ægte software, køb registrering og få bedre ægte tjenester. Hvis der er nogen overtrædelse, bedes du kontakte os via e-mail.

Mail To:help@itsvse.com