Ця стаття є дзеркальною статтею машинного перекладу, будь ласка, натисніть тут, щоб перейти до оригінальної статті.

Вид: 16456|Відповідь: 0

[ASP.NET] Поясніть повернення набору результатів федеративної таблиці запитів Linq

[Копіювати посилання]
Опубліковано 08.05.2015 16:34:23 | | |

У цій статті автор детально представляє спільний запит Linq, бо боюся, що читачі не дуже добре розуміють цей аспект, тому перш ніж говорити про спільний запит Linq, я спочатку поділюся з вами певною інформацією інформації, а потім розповім про те, як реалізований спільний запит Linq, сподіваючись допомогти вам.

Спершу розглянемо деякі знання щодо спільного запиту 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" };         
      повернути користувача;     
}
Коли ми визначаємо анонімний тип, його можна передати лише через тип об'єкта, і компілятор не знатиме фактичного типу анонімного типу після проходження.

Цю лінію можна накласти за допомогою методу розширення Cast. Нижче наведено прототип методу Cast.



публічний статичний T Cast (цей об'єкт o, T t)      
{            
   return ();         
}
2. Як створити анонімний список типів для федеративного запиту Linq?        



var User = GetAnonymous(). Cast(new { UserName = "", LastLoginIp = "" });         
var list = новий список< ?>();
Принцип той самий, що й вищезазначений.



var User = новий   
{     
   Ім'я користувача = "yaosansi", LastLoginIp = "127.0.0.1"
};              
var list = User.MakeList();         
Список. Add(User);            
Console.write(list[0]. Ім'я користувача);
Давайте розглянемо метод MakeList():



public static List MakeList (this T t) {            
    повернути новий список();      
}
Звісно, ви можете вважати, що наведений вище метод недостатньо ідеальний, і вам потрібно додати користувача до Списку, тому у вас є такий метод:      



публічний статичний список MakeList (цей T t, параметри T[] items)         
{            
   повернення нових списків(елементів);   
}  
Коли його викликають, його можна записати так:



var User = новий   
{   
  Ім'я користувача = "yaosansi", LastLoginIp = "127.0.0.1"   
};              
var list = User.MakeList(User);         
Console.write(list[0]. Ім'я користувача);   
Цього разу давайте перейдемо до суті і розберемося, як реалізовано федеративний запит Linq.



var q = від p у db. Продукція     
де p.Supplier.Country == "USA" && p.UnitsInStock == 0   
виберіть p;
Наведений вище запит — це дві пов'язані таблиці, і повертається лише вміст однієї таблиці, у цьому випадку на рівні даних може бути повернений сильно типізований Список. Наприклад:



Публічний список SelectProducts()   
{ var q = з p у db. Продукція     
       де p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       виберіть p;        
       повернути q.ToList;   
}
Якщо набір результатів, що повернулися, більше двох таблиць, як його слід передавати? Ви, мабуть, думали, що якщо набір результатів, що повертається, — це один рядок даних, ми можемо використати анонімний тип доставки, про який ми згадували раніше, щоб отримати потрібні результати. Публічний об'єкт



публічний об'єкт SelectProducts()  
{ var q = з p у db. Продукція      
       де p.Supplier.Country == "USA" && p.UnitsInStock == 0        
       вибрати новий {p.UnitsInStock,p.Supplier.Sid};      результат var = q.Single();  
       результат повернення;   
}
Однак ця передумова полягає в тому, що шар бізнес-логіки повинен знати конкретні типи типів анонімності на рівні даних. Це нашарування має мало значення. Це не те, чого ми хочемо. Крім того, метод використання анонімного типу List для повернення набору результатів багаторядкових даних також зазнав невдачі після експериментів. Це означає, що жоден із двох способів передачі анонімності на початку цієї статті не спрацює.

Метод 1: Federated запит Linq налагоджує класи з тією ж структурою, що й тип повернення



публічний клас CustomQuery      
{ public uint UnitsInStock   
   { get; декорація; }            
  публічний int Сід   
   { get; декорація; }        
}
Це можна вирішити, коли результати запиту є множиною з кількох таблиць. Оскільки потрібно знати тип поверненої анонімності, потрібно визначити додатковий клас, окрім того, що він не відповідає багатошаровим. Але це правда і може повернути потрібні результати за допомогою сильних типів.

Метод 2: Linq федеративний запит із використанням делегування System.Func (Джерело: Повернення var з методу в C# 3.0)

Рівень даних:



public IEnumerable GetCustomersWithOrders(Func,
TProjection> проєкція)   
{ повернення від клієнта в _customers           
     нехай customerOrders = з замовлення у _orders                                
     де порядок. CustomerID = customer.ID            
     вибрати проекцію (клієнт, клієнтЗамовлення);  
}
Шар бізнес-логіки:



var results = GetCustomersWithOrders(  
(клієнт, замовлення) => новий   
{ Ім'я = клієнт. Ім'я               
     OrderCount = накази. Count()        
});
Результат, який повертається таким чином, залишається справжнім анонімним типом у бізнес-логічному шарі і може використовуватися безпосередньо.

Метод 3: Федеративні запити Linq використовують збережені процедури або перегляди.




Попередній:LINQ отримує проблему повернення значення збереженої процедури, моя збережена процедура
Наступний:Microsoft відмовилася від IE і була налаштована зробити 220 000 рядків коду
Застереження:
Усе програмне забезпечення, програмні матеріали або статті, опубліковані Code Farmer Network, призначені лише для навчання та досліджень; Вищезазначений контент не повинен використовуватися в комерційних чи незаконних цілях, інакше користувачі несуть усі наслідки. Інформація на цьому сайті надходить з Інтернету, і спори щодо авторських прав не мають до цього сайту. Ви повинні повністю видалити вищезазначений контент зі свого комп'ютера протягом 24 годин після завантаження. Якщо вам подобається програма, будь ласка, підтримуйте справжнє програмне забезпечення, купуйте реєстрацію та отримайте кращі справжні послуги. Якщо є будь-яке порушення, будь ласка, зв'яжіться з нами електронною поштою.

Mail To:help@itsvse.com