V tomto článku autor podrobně představuje společný dotaz Linq, protože se obávám, že čtenáři tomuto aspektu příliš nerozumí, takže než se pustím do společného dotazu Linq, nejprve vám představím nějaké znalosti a poté popíšu, jak je Linq společný dotaz implementován, s nadějí, že vám pomůžu.
Nejprve si pojďme porozumět některým znalostním bodům společného dotazu Linq.
1. Anonymní typ doručení
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;
} Když definujeme anonymní typ, může být předán pouze přes typ objektu a kompilátor po předání nezná skutečný typ anonymního typu.
Tuto linku lze odlévat metodou Cast extension. Níže je prototyp metody Cast.
public static T Cast (tento objekt o, T t) { return ();
} 2. Jak vytvořit anonymní seznam typů pro federovaný dotaz Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = nový seznam< ?>(); Princip je stejný jako výše.
var User = nový { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); seznam. add(uživatel); Console.Write(list[0]. UserName); Podívejme se na metodu MakeList():
public static List MakeList(this T t) { vrátit nový Seznam();
} Samozřejmě si možná myslíte, že výše uvedená metoda není dostatečně dokonalá, a že je potřeba přidat uživatele do Seznamu, takže máte následující metodu:
veřejný statický seznam MakeList (tento T,parametry T[] položky) { vrátit nový seznam (položky); } Při volání lze zapsat jako:
var User = nový { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. UserName); Tentokrát se pojďme podívat k věci a pochopit, jak je federovaný dotaz Linq implementován.
var q = z p v db. Produkty kde p.Supplier.Country == "USA" & p.UnitsInStock == 0 Vyberte p; Výše uvedený dotaz jsou dvě související tabulky, přičemž se vrací pouze obsah jedné tabulky, v tomto případě lze v datové vrstvě vrátit silně typovaný Seznam. Například:
public List SelectProducts() { var q = z p v db. Produkty kde p.Supplier.Country == "USA" & p.UnitsInStock == 0 Vyberte p; vrátit q.ToList;
} Pokud je vrácená výsledná sada více než dvě tabulky, jak by měla být předána? Museli jste si myslet, že pokud je výsledná sada vrácená pouze jedna řádka dat, můžeme použít anonymní typ doručení, o kterém jsme mluvili dříve, abychom získali požadované výsledky. Veřejný objekt
veřejný 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ýsledek = q.Single(); Výsledek vrátit;
} Tato premisa však spočívá v tom, že vrstva obchodní logiky musí znát konkrétní typy anonymity v datové vrstvě. Toto vrstvení nemá velký význam. Tohle není to, co chceme. Navíc metoda použití anonymního typu List pro vrácení výsledků víceřádkových dat také selhala po experimentech. To znamená, že ani jedna ze dvou metod předávání anonymity na začátku tohoto článku nebude fungovat.
Metoda 1: Linkqův federovaný dotaz přizpůsobuje třídy se stejnou strukturou jako return typ
veřejná třída CustomQuery { public uint UnitsInStock { get; set; } public int Sid { get; set; }
} To lze vyřešit, když jsou výsledky dotazu množinou výsledků složené z více tabulek. Protože potřebujete znát typ anonymity, kterou vracíte, musíte definovat další třídu kromě toho, abyste nesplňovali multivrstvu. Ale to je pravda a může to vrátit potřebné výsledky pomocí silných typů.
Metoda 2: Linq federovaný dotaz pomocí delegace System.Func (Reference: Vrácení var z metody v C# 3.0)
Datová vrstva:
public IEnumerable GetCustomersWithOrders(Func, TProjection> projekce) { návrat od zákazníka v _customers nechť customerOrders = z objednávky v _orders kde řád. CustomerID = customer.ID vyberte projekci(zákazník, zákazníceObjednávky);
} Vrstva obchodní logiky:
var results = GetCustomersWithOrders( (zákazník, objednávky) => nové { Jméno = zákazník. Jméno OrderCount = řády. Count() }); Výsledek vrácený tímto způsobem je stále skutečným anonymním typem v obchodní logické vrstvě a lze jej použít přímo.
Metoda 3: Linkqovy federované dotazy používají uložené procedury nebo pohledy. |