2015-08-04 4 views
0

У меня есть 3 таблицы. Заказы, OrderItems и OrderItemServices. Каждый заказ может содержать несколько OrderItems, и каждый OrderItem может содержать несколько OrderItemServices. Я хочу получить список данных всех заказов из этих таблиц в Linq. Я мог бы написать объединение, но как сделать анонимный тип данных в select clasue, который может дать мне список заказов в этой иерархии?Выберите данные из 3 таблиц с Linq в SQL

Если я использую свойства навигации, а затем выберите OrderItemServices в предложении бокового выбора, как показано ниже, он будет запускать индивидуальный запрос выбора для каждого OrderItemService, которого я хочу избежать.

from order in Orders 
select new 
{ 
    ActiveOrders = order, 
    ActiveOrderItems =order.OrderItems, 
    ActiveServices = order.OrderItems.Select(o => o.OrderItemServices) 
} 

Возможно ли группировать каждый заказ со структурой нескольких элементов внутри него и нескольких сервисов внутри элементов?

+0

Итак, вы хотите избежать использования соединения? – DotNetHitMan

+0

Я думаю, что OP ищет иерархический набор данных, а не «сплющенный» набор данных. – DeadZone

+0

Я не хочу этого избегать. Я не хочу запускать индивидуальные запросы для OrderItems и OrderItemServices, как в вышеприведенном запросе. – Shetty

ответ

0

См msdn, чтобы начать на LINQ To SQL

Чтобы получить данные из трех таблиц вы можете получить представление из следующего простого примера

var data = (from product in context.Products 
      from department in context.Departments 
      from category in context.Categories 
      where product.DeptId == department.DeptId 
      && product.CatId == category.CatId 
      select new 
      { 
       product.Code, 
       product.Name, 
       department.Name, 
       category.Name 
      }).Distinct.ToList(); 
+0

Этот пример относится к соотношению 1: 1. У меня отношение 1 к N в таблицах – Shetty

0

Вы должны настроить свой контекст, чтобы использовать жадную загрузку:

var context = new MyDataContext(); 
var options = new DataLoadOptions(); 
options.LoadWith<Orders>(x => x.OrderItems); 
options.LoadWith<OrderItems>(x => x.OrderItemServices); 
context.LoadOptions = options; 

var query = from order in context.Orders // ... etc 

Затем подпункты будут включены в исходный результат запроса и не будут вызывать дополнительные запросы к базе данных. Это будет использовать JOIN внутренне, чтобы получить все данные за один раз. Вы можете проверить сгенерированный SQL с помощью SQL Server Profiler.

http://blog.stevensanderson.com/2007/12/02/linq-to-sql-lazy-and-eager-loading-hiccups/

Смежные вопросы