Tämä artikkeli on konekäännöksen peiliartikkeli, klikkaa tästä siirtyäksesi alkuperäiseen artikkeliin.

Näkymä: 16456|Vastaus: 0

[ASP.NET] Selitä Linqin federated query table -tulosjoukon palautus

[Kopioi linkki]
Julkaistu 8.5.2015 16.34.23 | | |

Tässä artikkelissa kirjoittaja esittelee Linq joint queryn yksityiskohtaisesti, koska pelkään, etteivät lukijat ymmärrä tätä osa-aluetta kovin hyvin, joten ennen kuin puhun Linq joint querysta, kerron ensin hieman tietoa teille ja sitten kerron, miten Linq joint query toteutetaan, toivoen voivani auttaa teitä.

Ensiksi ymmärretään joitakin Linq-yhteiskyselyn tietopisteitä.

1. Anonyymi toimitustyyppi



staattinen void Pää(merkkijono[] args)   
{ var Käyttäjä = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.UserName);      
}         
staattinen objekti GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      return User;     
}
Kun määrittelemme anonyymin tyypin, se voidaan välittää vain objektityypin kautta, eikä kääntäjä tiedä anonyymin tyypin todellista tyyppiä syötön jälkeen.

Tämä viiva voidaan heittää Cast-laajennusmenetelmällä. Alla on prototyyppi Cast-menetelmästä.



julkinen staattinen T Cast (tämä objekti o, T t)      
{            
   paluu ();         
}
2. Kuinka luoda anonyymi tyyppilista Linq federated querylle?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = uusi lista< ?>();
Periaate on sama kuin yllä.



var Käyttäjä = uusi   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
lista. add(User);            
Console.Write(list[0]. UserName);
Katsotaanpa MakeList()-menetelmää:



julkinen staattinen lista MakeList (this T t) {            
    return new List();      
}
Tietenkin saatat ajatella, että yllä oleva menetelmä ei ole tarpeeksi täydellinen, ja sinun täytyy lisätä käyttäjä listalle, joten sinulla on seuraava menetelmä:      



julkinen staattinen lista MakeList (tämä T t, parametrit T[] esineet)         
{            
   palauttaa uusi lista (esineet);   
}  
Kun sitä kutsutaan, se voidaan kirjoittaa näin:



var Käyttäjä = uusi   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList (Käyttäjä);         
Console.Write(list[0]. UserName);   
Tällä kertaa mennään suoraan asiaan ja ymmärretään, miten Linq federated query on toteutettu.



VAR q = pisteestä p db:ssä. Tuotteet     
missä p.Supplier.Country == "USA" && p.UnitsInStock == 0   
valitse p;
Yllä oleva kysely koostuu kahdesta toisiinsa liittyvästä taulusta, ja palautetaan vain yhden taulun sisältö; tässä tapauksessa vahvasti tyypitetyn listan voi palauttaa datakerrokseen. Esimerkiksi:



julkinen lista SelectProducts()   
{ var q = p:stä db:ssä. Tuotteet     
       missä p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       valitse p;        
       return q.ToList;   
}
Jos palautettu tulosjoukko on enemmän kuin kaksi taulukkoa, miten se tulisi ohittaa? Olet varmasti ajatellut, että jos palautettu tulosjoukko on yksi datarivi, voimme käyttää aiemmin mainitsemaamme anonyymiä toimitustapoja saadaksemme tarvitsemamme tulokset. Julkinen kohde



julkinen objekti SelectProducts()  
{ var q = p:stä db:ssä. Tuotteet      
       missä p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       valitse new {p.UnitsInStock,p.Supplier.Sid};      var result = q.Single();  
       palautustulos;   
}
Tämä oletus kuitenkin on, että liiketoimintalogiikkakerroksen täytyy tuntea tietyt anonymiteetityypit datakerroksessa. Tämä kerrostaminen on vähäpätöistä. Tämä ei ole sitä, mitä haluamme. Lisäksi anonyymin listatyypin käyttö monirivisten tietojen tulosaineiston palauttamiseksi epäonnistui kokeiden jälkeen. Tämä tarkoittaa, että kumpikaan tämän artikkelin alussa mainituista anonymiteetin välittämistavoista ei toimi.

Menetelmä 1: Linq federated query räätälöi luokkia, joiden rakenne on sama kuin palautustyyppi



public class CustomQuery      
{ julkinen uint UnitsInStock   
   { saa; setti; }            
  julkinen int Sid   
   { saa; setti; }        
}
Tämä voidaan ratkaista, kun kyselytulokset ovat useiden taulujen tulosjoukko. Koska sinun täytyy tietää palautetun anonymiteetin tyyppi, sinun täytyy määritellä lisäluokka monikerroksisen lisäksi. Mutta tämä pitää paikkansa, ja voi tuottaa tarvitsemamme tulokset vahvoilla tyypeillä.

Menetelmä 2: Linqin liittoutunut kysely käyttäen System.Func-delegointia (Lähde: Varin palauttaminen metodista C# 3.0:ssa)

Tietokerros:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> projektio)   
{ paluu asiakkaalta _customers           
     let customerOrders = tilauksesta _orders                                
     missä järjestyksessä. CustomerID = customer.ID            
     valitse projektio (asiakas, asiakasTilaukset);  
}
Liiketoimintalogiikkakerros:



var results = GetCustomersWithOrders(  
(asiakas, tilaukset) => uusi   
{ Nimi = asiakas. Nimi               
     OrderCount = tilaukset. Count()        
});
Tällä tavalla palautettu tulos on edelleen aito anonyymi tyyppi liiketoimintalogiikkakerroksessa ja sitä voidaan käyttää suoraan.

Menetelmä 3: Linqin liittoutuneet kyselyt käyttävät tallennettuja proseduureja tai näkymiä.




Edellinen:LINQ saa tallennetun proseduurin palautusarvon ongelman tallennetun menettelyni
Seuraava:Microsoft hylkäsi IE:n ja oli päättänyt tehdä 220 000 koodiriviä
Vastuuvapauslauseke:
Kaikki Code Farmer Networkin julkaisemat ohjelmistot, ohjelmamateriaalit tai artikkelit ovat tarkoitettu vain oppimis- ja tutkimustarkoituksiin; Yllä mainittua sisältöä ei saa käyttää kaupallisiin tai laittomiin tarkoituksiin, muuten käyttäjät joutuvat kantamaan kaikki seuraukset. Tämän sivuston tiedot ovat peräisin internetistä, eikä tekijänoikeuskiistat liity tähän sivustoon. Sinun tulee poistaa yllä oleva sisältö kokonaan tietokoneeltasi 24 tunnin kuluessa lataamisesta. Jos pidät ohjelmasta, tue aitoa ohjelmistoa, osta rekisteröityminen ja hanki parempia aitoja palveluita. Jos rikkomuksia ilmenee, ota meihin yhteyttä sähköpostitse.

Mail To:help@itsvse.com