Denne artikkelen er en speilartikkel om maskinoversettelse, vennligst klikk her for å hoppe til originalartikkelen.

Utsikt: 16456|Svare: 0

[ASP.NET] Forklar returen av Linqs fødererte spørringstabellresultatsett

[Kopier lenke]
Publisert på 08.05.2015 16:34:23 | | |

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.




Foregående:LINQ får problemet med lagret prosedyre returnere verdi i min lagrede prosedyre
Neste:Microsoft forlot IE og var fast bestemt på å lage 220 000 linjer kode
Ansvarsfraskrivelse:
All programvare, programmeringsmateriell eller artikler publisert av Code Farmer Network er kun for lærings- og forskningsformål; Innholdet ovenfor skal ikke brukes til kommersielle eller ulovlige formål, ellers skal brukerne bære alle konsekvenser. Informasjonen på dette nettstedet kommer fra Internett, og opphavsrettstvister har ingenting med dette nettstedet å gjøre. Du må fullstendig slette innholdet ovenfor fra datamaskinen din innen 24 timer etter nedlasting. Hvis du liker programmet, vennligst støtt ekte programvare, kjøp registrering, og få bedre ekte tjenester. Hvis det foreligger noen krenkelse, vennligst kontakt oss på e-post.

Mail To:help@itsvse.com