|
|
Közzétéve 2015. 05. 08. 16:34:23
|
|
|

Ebben a cikkben a szerző részletesen bemutatja a Linq közös lekérdezést, mert attól tartok, az olvasók nem értik ezt a szempontot, ezért mielőtt a Linq közös lekérdezésről beszélnénk, először néhány tudást adok neked, majd arról, hogyan valósítják meg a Linq közös lekérdezést, remélve, hogy segíthetek neked.
Először is értsük meg a Linq közös lekérdezés néhány tudáspontját.
1. Névtelen kézbesítési típus
statikus void Main(string[] args) { var Felhasználó = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } statikus objektum GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; visszatérő felhasználó;
} Amikor definiálunk egy anonim típust, az csak az objektum típuson keresztül adható át, és a fordító nem ismeri az anonim típus tényleges típusát a váltás után.
Ez a vonal a Cast extension módszerrel is elönthető. Az alábbiakban a Cast módszer prototípusa látható.
nyilvános statikus T Cast (ez az objektum o, T t) { return ();
} 2. Hogyan lehet anonim típuslistát generálni a Linq szövetségi lekérdezéshez?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = új lista< ?>(); Az elv ugyanaz, mint a fentiek.
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); listát. Add(User); Console.Write(list[0]. UserName); Nézzük meg a MakeList() módszert:
public static List MakeList (this T t) { return new List();
} Természetesen azt gondolhatod, hogy a fenti módszer nem elég tökéletes, ezért szükséged van egy felhasználót a listára, így a következő módszer van:
nyilvános statikus lista MakeList (ez a T t, paraméterek T[] tételek) { visszaadja az új listát (tárgyakat); } Hívásakor így írható:
var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. UserName); Ezúttal térjünk a lényegre, és értsük meg, hogyan valósítják meg a Linq szövetséges lekérdezését.
var q = p-től a db-ben. Termékek ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0 válassz p; A fenti lekérdezés két kapcsolódó táblázatból áll, és csak egy tábla tartalma kerül vissza, ebben az esetben egy erősen típusozott lista is vissza lehet adni az adatrétegben. Például:
nyilvános lista SelectProducts() { var q = p-től a db-ben. Termékek ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0 válassz p; return q.ToList;
} Ha a visszaadott eredményhalmaz több mint két tábla, hogyan kell átadni? Biztosan gondoltad, hogy ha az eredményhalmaz egyetlen adatsorból áll, akkor az előbb említett névtelen kézbesítési típussal megkapjuk a szükséges eredményeket. Köztárgy
public objektum SelectProducts() { var q = p-től a db-ben. Termékek ahol p.Supplier.Country == "USA" && p.UnitsInStock == 0 válassz új {p.UnitsInStock,p.Supplier.Sid}; var result = q.Single(); visszaadási eredmény;
} Ez az alapelv azonban az, hogy az üzleti logikai rétegnek ismernie kell az adatrétegben található konkrét anonimitási típusokat. Ez a rétegezés kevés jelentőséggel bír. Ez nem az, amit akarunk. Továbbá, az anonim List típus alkalmazása a többsoros adat eredményhalmazának visszaadására szintén megbukott kísérletek után. Ez azt jelenti, hogy a cikk elején szereplő anonimitás átadásának egyik módszere sem működik.
1. módszer: A Linq szövetséges lekérdezés testreszabja azokat az osztályokat, amelyek ugyanazt a struktúrát tartalmazzák, mint a visszaküldési típus
public class CustomQuery { public uint UnitsInStock { get; Szett; } public int Sid { get; Szett; }
} Ez akkor oldható meg, ha a lekérdezés eredménye több táblából áll. Mivel ismerned kell, milyen anonimitás típusa visszatér, egy további osztályt is definiálnod kell azon kívül, hogy nem felel meg a többrétegnek. De ez igaz, és erős típusok segítségével visszaadhatja a szükséges eredményeket.
2. módszer: Linq federált lekérdezés System.Func delegációval (Hivatkozás: Var visszaadása egy C# 3.0 metódusból)
Adatréteg:
public IEnumerable GetCustomersWithOrders(Func, TProjection> vetítés) { visszaküldés az ügyféltől _customers let customerOrders = a rendelésből _orders hol rend. CustomerID = customer.ID kiválasztani a vetítést (customer, customerOrders);
} Üzleti logikai réteg:
var results = GetCustomersWithOrders( (vásárló, rendelések) => új { Név = ügyfél. Név OrderCount = parancsok. Count() }); Az ilyen módon visszaadott eredmény továbbra is valódi névtelen típus az üzleti logikai rétegben, és közvetlenül használható.
3. módszer: A Linq szövetséges lekérdezések tárolt eljárásokat vagy nézeteket használnak. |
Előző:A LINQ tárolt eljárás visszaküldési érték problémáját kapja a tárolt eljárásomKövetkező:A Microsoft elhagyta az IE-t, és eltökélte, hogy 220 000 sor kódot készít
|