Tento článok je zrkadlovým článkom o strojovom preklade, kliknite sem pre prechod na pôvodný článok.

Pohľad: 16456|Odpoveď: 0

[ASP.NET] Vysvetlite návrat množiny výsledkov federovanej dotazovacej tabuľky Linq

[Kopírovať odkaz]
Zverejnené 8. 5. 2015 16:34:23 | | |

V tomto článku autor podrobne predstavuje Linq spoločný dotaz, pretože sa obávam, že čitatelia tento aspekt veľmi nechápu, takže predtým, než budem hovoriť o Linq spoločnom dotaze, vám najprv predstavím niekoľko poznatkov a potom vám popíšem, ako je Linq spoločný dotaz implementovaný, s nádejou, že vám pomôžem.

Najprv si poďme porozumieť niektorým znalostným bodom Linq spoločného dotazu.

1. Anonymný typ doručenia



static void Main (string[] args)   
{ var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });           
   Console.Write(User.Username);      
}         
statický objekt GetAnonymous()     
{ var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" };         
      return User;     
}
Keď definujeme anonymný typ, môže prejsť iba cez objektový typ a kompilátor po odoslaní nepozná skutočný typ anonymného typu.

Táto línia môže byť odliata metódou predlžovania liatia. Nižšie je prototyp metódy Cast.



public static T Cast (tento objekt o, T t)      
{            
   return ();         
}
2. Ako vytvoriť anonymný zoznam typov pre federovaný dotaz Linq?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = nový zoznam< ?>();
Princíp je rovnaký ako vyššie.



var User = nový   
{     
   UserName = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
zoznam. Add(User);            
Console.write(list[0]. UserName);
Pozrime sa na metódu MakeList():



public static List MakeList(this T t) {            
    vrátiť nový zoznam();      
}
Samozrejme, možno si myslíte, že vyššie uvedená metóda nie je dostatočne dokonalá a musíte pridať používateľa do zoznamu, takže máte nasledujúcu metódu:      



verejný statický List MakeList (tento T t,parametre T[] položky)         
{            
   vrátiť nový zoznam(položky);   
}  
Keď je volaná, môže byť zapísaná ako:



var User = nový   
{   
  UserName = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.write(list[0]. UserName);   
Tentoraz sa poďme rovno k veci a pochopme, ako je Linq federovaný dotaz implementovaný.



var q = z p v db. Produkty     
kde p.Supplier.Country == "USA" & p.UnitsInStock == 0   
Vyberte p;
Vyššie uvedený dotaz sú dve súvisiace tabuľky, pričom sa vracia iba obsah jednej tabuľky, v takom prípade môže byť v dátovej vrstve vrátený silne typovaný Zoznam. Napríklad:



public List SelectProducts()   
{ var q = z p v db. Produkty     
       kde p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       Vyberte p;        
       return q.ToList;   
}
Ak je vrátená množina výsledkov viac ako dve tabuľky, ako by sa mala posunúť ďalej? Museli ste si myslieť, že ak je výsledná množina vrátená len jeden riadok dát, môžeme použiť anonymný typ doručenia, o ktorom sme hovorili vyššie, aby sme získali požadované výsledky. Verejný objekt



public objekt SelectProducts()  
{ var q = z p v db. Produkty      
       kde p.Supplier.Country == "USA" & p.UnitsInStock == 0        
       vyberte nové {p.UnitsInStock,p.Supplier.Sid};      var výsledok = q.Single();  
       vrátiť výsledok;   
}
Táto premisa však spočíva v tom, že vrstva obchodnej logiky musí poznať konkrétne typy anonymity v dátovej vrstve. Toto vrstvenie nemá veľký význam. Toto nie je to, čo chceme. Navyše, metóda použitia anonymného typu List na vrátenie výsledkovej množiny viacriadkových dát tiež zlyhala po experimentoch. To znamená, že ani jedna z dvoch metód prekonania anonymity na začiatku tohto článku nebude fungovať.

Metóda 1: Linq federovaný dotaz prispôsobuje triedy s rovnakou štruktúrou ako return typ



verejná trieda CustomQuery      
{ public uint UnitsInStock   
   { get; set; }            
  public int Sid   
   { get; set; }        
}
Toto sa dá vyriešiť, keď sú výsledky dotazu množinou výsledkov viacerých tabuliek. Keďže potrebujete vedieť, aký typ anonymity sa vráti, musíte definovať ďalšiu triedu okrem toho, že nespĺňa multivrstvu. Ale to je pravda a môže priniesť potrebné výsledky pomocou silných typov.

Metóda 2: Linq federovaný dotaz pomocou delegácie System.Func (Referencia: Vrátenie var z metódy v C# 3.0)

Dátová vrstva:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> projekcia)   
{ návrat od zákazníka v _customers           
     nech customerOrders = z objednávky v _orders                                
     kde poradie. CustomerID = customer.ID            
     vyberte projekciu (zákazník, zákazníkObjednávky);  
}
Vrstva obchodnej logiky:



var results = GetCustomersWithOrders(  
(zákazník, objednávky) => nové   
{ Meno = zákazník. Meno               
     OrderCount = orders. Count()        
});
Výsledok vrátený týmto spôsobom je stále skutočným anonymným typom vo vrstve business logiky a môže byť použitý priamo.

Metóda 3: Linkqove federované dotazy používajú uložené procedúry alebo pohľady.




Predchádzajúci:LINQ získa problém s vrátenou hodnotou uloženej procedúry
Budúci:Microsoft opustil IE a bol odhodlaný vytvoriť 220 000 riadkov kódu
Vyhlásenie:
Všetok softvér, programovacie materiály alebo články publikované spoločnosťou Code Farmer Network slúžia len na vzdelávacie a výskumné účely; Vyššie uvedený obsah nesmie byť použitý na komerčné alebo nezákonné účely, inak nesú všetky následky používateľmi. Informácie na tejto stránke pochádzajú z internetu a spory o autorské práva s touto stránkou nesúvisia. Musíte úplne vymazať vyššie uvedený obsah zo svojho počítača do 24 hodín od stiahnutia. Ak sa vám program páči, podporte originálny softvér, zakúpte si registráciu a získajte lepšie originálne služby. Ak dôjde k akémukoľvek porušeniu, kontaktujte nás prosím e-mailom.

Mail To:help@itsvse.com