Ta članek je zrcalni članek strojnega prevajanja, kliknite tukaj za skok na izvirni članek.

Pogled: 16456|Odgovoriti: 0

[ASP.NET] Pojasnite vračilo rezultatov Linqove federirane tabele poizvedb

[Kopiraj povezavo]
Objavljeno na 8. 05. 2015 16:34:23 | | |

V tem članku avtor podrobno predstavi Linq skupno poizvedbo, ker se bojim, da bralci tega vidika ne razumejo dobro, zato bom pred pogovorom o Linq skupnih poizvedbah najprej predstavil nekaj znanja, nato pa o tem, kako je Linq skupna poizvedba implementirana, v upanju, da vam bom pomagal.

Najprej si oglejmo nekaj vidikov znanja o Linq skupnem poizvedbnem sistemu.

1. Anonimna vrsta dostave



static void Main (string[] args)   
{ var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(uporabniško.uporabniško-ime);      
}         
statični objekt GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      return User;     
}
Ko definiramo anonimni tip, ga lahko posredujemo le skozi objektni tip, prevajalnik pa po prenosu ne bo poznal dejanskega tipa anonimnega tipa.

To vrvico je mogoče uliti z metodo podaljševanja. Spodaj je prototip metode Cast.



javni statični T Cast (ta objekt o, T t)      
{            
   return ();         
}
2. Kako ustvariti anonimni seznam tipov za Linq federirano poizvedbo?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = nov seznam< ?>();
Načelo je enako kot zgoraj.



var User = nov   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
seznam. Add(User);            
Console.write(list[0]. Uporabniško ime);
Poglejmo si metodo MakeList():



javni statični List MakeList(this T t) {            
    vrni nov List();      
}
Seveda morda menite, da zgornja metoda ni dovolj popolna in da morate na seznam dodati uporabnika, zato imate naslednjo metodo:      



javni statični seznam MakeList (ta T t,parametri T[] elementi)         
{            
   vrni nov seznam(elemente);   
}  
Ko ga pokličemo, ga lahko zapišemo kot:



var User = nov   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.write(list[0]. Uporabniško ime);   
Tokrat pa se lotimo bistva in poglejmo, kako je Linq federirana poizvedba implementirana.



var q = iz p v db. Izdelki     
kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0   
Izberite P;
Zgornja poizvedba sta dve povezani tabeli, pri čemer se vrne le vsebina ene tabele; v tem primeru je mogoče v podatkovni plasti vrniti močno tipiziran seznam. Na primer:



javni seznam SelectProducts()   
{ var q = iz p v db. Izdelki     
       kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0        
       Izberite P;        
       vrni q.ToList;   
}
Če je vrnjeni niz rezultatov več kot dve tabeli, kako naj se prenese? Verjetno ste mislili, da če je vrnjeni nabor rezultatov ena sama vrstica podatkov, lahko uporabimo anonimno vrsto dostave, ki smo jo omenili prej, da dobimo potrebne rezultate. Javni objekt



javni objekt SelectProducts()  
{ var q = iz p v db. Izdelki      
       kjer p.Supplier.Country == "ZDA" & p.UnitsInStock == 0        
       izberite novo {p.UnitsInStock,p.Supplier.Sid};      var result = q.Single();  
       vrni rezultat;   
}
Vendar pa je predpostavka, da mora poslovna logična plast poznati specifične vrste anonimnih vrst v podatkovni plasti. To plastenje nima velikega pomena. To ni tisto, kar si želimo. Poleg tega je metoda uporabe anonimnega tipa List za vračanje rezultatov večvrstičnih podatkov po eksperimentih prav tako odpovedala. To pomeni, da nobena od dveh metod za ohranjanje anonimnosti na začetku tega članka ne bo delovala.

Metoda 1: Linq federirana poizvedba prilagaja razrede z enako strukturo kot tip vrnitve



javni razred CustomQuery      
{ public uint UnitsInStock   
   { get; set; }            
  javno int Sid   
   { get; set; }        
}
To je mogoče rešiti, ko so rezultati poizvedb množica rezultatov več tabel. Ker morate vedeti, kakšna anonimnost se vrne, morate poleg večplastnosti definirati še dodatno razred. A to drži in lahko prinese potrebne rezultate z močnimi tipi.

Metoda 2: Linq federirana poizvedba z uporabo delegacije System.Func (Referenca: Vračanje var iz metode v C# 3.0)

Podatkovna plast:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> projekcija)   
{ vračilo od stranke v _customers           
     naj customerOrders = iz naročila v _orders                                
     kjer red. CustomerID = customer.ID            
     izberite projekcijo(stranka, naročila stranke);  
}
Plast poslovne logike:



var results = GetCustomersWithOrders(  
(kupec, naročila) => novo   
{ Ime = stranka. Ime               
     OrderCount = naročila. Count()        
});
Rezultat, ki se vrne na ta način, je še vedno pravi anonimni tip v plasti poslovne logike in ga je mogoče uporabiti neposredno.

Metoda 3: Linq federirane poizvedbe uporabljajo shranjene postopke ali poglede.




Prejšnji:LINQ dobi problem z vrnitvijo vrednosti shranjene procedure
Naslednji:Microsoft je opustil IE in bil odločen, da bo naredil 220.000 vrstic kode
Disclaimer:
Vsa programska oprema, programski materiali ali članki, ki jih izdaja Code Farmer Network, so namenjeni zgolj učnim in raziskovalnim namenom; Zgornja vsebina ne sme biti uporabljena v komercialne ali nezakonite namene, sicer uporabniki nosijo vse posledice. Informacije na tej strani prihajajo z interneta, spori glede avtorskih pravic pa nimajo nobene zveze s to stranjo. Zgornjo vsebino morate popolnoma izbrisati z računalnika v 24 urah po prenosu. Če vam je program všeč, podprite pristno programsko opremo, kupite registracijo in pridobite boljše pristne storitve. Če pride do kakršne koli kršitve, nas prosimo kontaktirajte po elektronski pošti.

Mail To:help@itsvse.com