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. |