Denna artikel är en spegelartikel om maskinöversättning, klicka här för att hoppa till originalartikeln.

Utsikt: 16456|Svar: 0

[ASP.NET] Förklara återlämnandet av Linqs federerade frågetabellsresultatuppsättning

[Kopiera länk]
Publicerad på 2015-05-08 16:34:23 | | |

I denna artikel introducerar författaren Linq joint query i detalj, eftersom jag är rädd att läsarna helt enkelt inte förstår denna aspekt särskilt väl, så innan jag pratar om Linq joint query kommer jag först att ge dig lite kunskap och sedan prata om hur Linq joint query implementeras, i hopp om att hjälpa dig.

Först, låt oss förstå några kunskapspunkter kring Linqs gemensamma fråga.

1. Anonym typ av leverans



statiskt tomrum Main(string[] args)   
{ var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(Användare.Användarnamn);      
}         
statiskt objekt GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      returnera Användare;     
}
När vi definierar en anonym typ kan den endast skickas genom objekttypen, och kompilatorn kommer inte att känna till den faktiska typen av den anonyma typen efter att ha skickat den.

Denna linje kan kastas med Cast extension-metoden. Nedan följer en prototyp av Cast-metoden.



offentlig statisk T-kast (detta objekt o, T t)      
{            
   återvända ();         
}
2. Hur genererar man en anonym typlista för Linqs federerade sökningar?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = ny List< ?>();
Principen är densamma som ovan.



var User = new   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
lista. Add(User);            
Console.Write(list[0]. UserName);
Låt oss titta på MakeList()-metoden:



publik statisk Lista MakeList (denna T t) {            
    återlämna ny Lista();      
}
Självklart kanske du tycker att metoden ovan inte är tillräckligt perfekt, och att du behöver lägga till en användare i listan, så du har följande metod:      



offentlig statisk Lista MakeList (denna T t, params T[] artiklar)         
{            
   returnera ny lista (objekter);   
}  
När den anropas kan den skrivas som:



var User = new   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = Användare.MakeList(Användare);         
Console.Write(list[0]. UserName);   
Den här gången ska vi gå rakt på sak och förstå hur Linqs federerade fråga implementeras.



var q = från p i db. Produkter     
där p.Leverantör.Land == "USA" && p.EnheterInLager == 0   
välj p;
Ovanstående fråga består av två relaterade tabeller, och endast innehållet i en tabell returneras, i detta fall kan en starkt typad List returneras i dataskiktet. Till exempel:



publik lista SelectProducts()   
{ var q = från p i db. Produkter     
       där p.Leverantör.Land == "USA" && p.EnheterInLager == 0        
       välj p;        
       returnera q.ToList;   
}
Om den returnerade resultatuppsättningen är fler än två tabeller, hur ska den då skickas? Du måste ha tänkt att om resultatmängden som returneras är en enda datarad, kan vi använda den anonyma leveranstyp vi nämnde tidigare för att få de resultat vi behöver. Offentligt syfte



publikt objekt SelectProducts()  
{ var q = från p i db. Produkter      
       där p.Leverantör.Land == "USA" && p.EnheterInLager == 0        
       välj nya {p.UnitsInStock,p.Supplier.Sid};      var resultat = q. Singel();  
       återvändande resultat;   
}
Denna premiss är dock att affärslogikskiktet behöver känna till de specifika typerna av anonymitetstyper i datalagret. Denna lager-på-lager-på-lager är av liten betydelse. Det här är inte vad vi vill. Dessutom misslyckades metoden med att använda den anonyma listtypen för att returnera resultatmängden av flerradsdata efter experiment. Detta innebär att ingen av de två metoderna för att överföra anonymitet i början av denna artikel kommer att fungera.

Metod 1: Linq federerad fråga anpassar klasser med samma struktur som returtypen



publik klass CustomQuery      
{ public uint UnitsInStock   
   { get; set; }            
  offentlig int Sid   
   { get; set; }        
}
Detta kan lösas när frågeresultaten är en resultatmängd av flera tabeller. Eftersom du behöver veta vilken typ av anonymitet som returneras, behöver du definiera en extra klass utöver att inte följa multilageret. Men detta är sant och kan ge de resultat vi behöver med starka typer.

Metod 2: Linq-federerad fråga med System.Func-delegering (Referens: Att returnera var från en metod i C# 3.0)

Datalager:



public IEnumerable GetCustomersWithOrders(Func,
TProjektion> projektion)   
{ returnera från kund i _customers           
     let customerOrders = från order i _orders                                
     Där ordning. CustomerID = customer.ID            
     välj projektion(kund, kundOrders);  
}
Affärslogiklager:



var results = GetCustomersWithOrders(  
(kund, beställningar) => nytt   
{ Namn = kund. Namn               
     OrderCount = beställningar. Count()        
});
Resultatet som returneras på detta sätt är fortfarande en sann anonym typ i affärslogiklagret och kan användas direkt.

Metod 3: Linq-federerade frågor använder lagrade procedurer eller vyer.




Föregående:LINQ får problem med lagrad procedur returnera värde min lagrade procedur
Nästa:Microsoft övergav IE och var fast beslutna att göra 220 000 rader kod
Friskrivning:
All programvara, programmeringsmaterial eller artiklar som publiceras av Code Farmer Network är endast för lärande- och forskningsändamål; Ovanstående innehåll får inte användas för kommersiella eller olagliga ändamål, annars kommer användarna att bära alla konsekvenser. Informationen på denna sida kommer från internet, och upphovsrättstvister har inget med denna sida att göra. Du måste helt radera ovanstående innehåll från din dator inom 24 timmar efter nedladdning. Om du gillar programmet, vänligen stöd äkta programvara, köp registrering och få bättre äkta tjänster. Om det finns något intrång, vänligen kontakta oss via e-post.

Mail To:help@itsvse.com