В тази статия авторът представя подробно Linq съвместната заявка, защото се страхувам, че читателите просто не разбират този аспект много добре, затова преди да говоря за Linq съвместната заявка, първо ще споделя някои знания за вас, а след това ще обясня как се реализира Linq joint query, надявайки се да ви помогна.
Първо, нека разберем някои знания за съвместната заявка на Linq.
1. Анонимен тип доставка
static void Main(string[] args) { var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); Console.Write(User.UserName); } статичен обект GetAnonymous() { var User = new { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; return User;
} Когато дефинираме анонимен тип, той може да бъде прехвърлен само през обектния тип и компилаторът няма да знае действителния тип на анонимния тип след преминаване.
Тази линия може да се излита чрез метода Cast extension. По-долу е представен прототип на метода Cast.
публичен статичен T Cast (този обект o, T t) { return ();
} 2. Как да генерирам анонимен типов списък за федеративна заявка Linq?
var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" }); var list = нов списък< ?>(); Принципът е същият като горния.
var User = нов { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(); списък. Add(User); Console.Write(list[0]. Потребителско име); Нека разгледаме метода MakeList():
публичен статичен списък MakeList (this T t) { връщане на нов списък();
} Разбира се, може да смятате, че горният метод не е достатъчно перфектен и трябва да добавите потребител към списъка, затова имате следния метод:
публичен статичен списък MakeList (този T t, параметри T[] елементи) { връщане на нови Списъци (елементи); } Когато се извика, може да се запише като:
var User = нов { UserName = "yaosansi", LastLoginIp = "127.0.0.1" }; var list = User.MakeList(User); Console.Write(list[0]. Потребителско име); Този път нека преминем към същината и да разберем как се реализира федеративната заявка на Linq.
var q = от p в db. Продукти където p.Supplier.Държава == "САЩ" && p.UnitsInStock == 0 изберете p; Горната заявка е две свързани таблици и се връща само съдържанието на една таблица; в този случай силно типизиран списък може да бъде върнат в слоя данни. Например:
Публичен списък SelectProducts() { var q = от p в db. Продукти където p.Supplier.Държава == "САЩ" && p.UnitsInStock == 0 изберете p; return q.ToList;
} Ако върнатият набор от резултати е повече от две таблици, как трябва да бъде предаден? Сигурно сте мислили, че ако върнатият набор от резултати е един ред данни, можем да използваме анонимния тип доставка, който споменахме по-рано, за да получим нужните резултати. Обществен обект
публичен обект SelectProducts() { var q = от p в db. Продукти където p.Supplier.Държава == "САЩ" && p.UnitsInStock == 0 изберете нов {p.UnitsInStock,p.Supplier.Sid}; var резултат = q.Single(); резултат от връщане;
} Въпреки това, тази предпоставка е, че бизнес логическият слой трябва да познава конкретните типове типове анонимност в слоя данни. Това наслагване няма голямо значение. Това не е, което искаме. Освен това методът за използване на анонимния тип List за връщане на набор от резултати от многоредови данни също се провали след експерименти. Това означава, че нито един от двата метода за предаване на анонимност в началото на тази статия няма да работи.
Метод 1: Linq федеративна заявка персонализира класове със същата структура като типа return.
публичен клас CustomQuery { public uint UnitsInStock { get; декорация; } публичен в Сид { get; декорация; }
} Това може да се реши, когато резултатите от заявката са набор от множество таблици. Тъй като трябва да знаете какъв тип анонимност е върната, трябва да дефинирате допълнителен клас, освен че не се съобразяваш с мултислой. Но това е вярно и може да върне нужните резултати, използвайки силни типове.
Метод 2: Linq федеративна заявка чрез System.Func делегация (Референция: Връщане на var от метод в C# 3.0)
Слой данни:
public IEбезброй GetCustomersWithOrders(Func, TProjection> проекция) { връщане от клиент в _customers нека customerOrders = от поръчка в _orders където ред. CustomerID = customer.ID select projection (клиент, customerOrders);
} Слой на бизнес логиката:
var резултати = GetCustomersWithOrders( (клиент, поръчки) => нов { Име = клиент. Име OrderCount = заповеди. Count() }); Резултатът, върнат по този начин, все още е истински анонимен тип в бизнес логическия слой и може да се използва директно.
Метод 3: Federated заявките на Linq използват съхранени процедури или изгледи. |