2012-02-23 5 views
0

У меня есть запрос, как показано нижеEntity Framework Заказ Navigate объектов

return this.Context.Modules 
       .Select(p => new 
       { 
        Module = p, 
        Page = p.Pages.OrderBy(c => c.AuthOrder) 

       }).ToList() 
       .Select(a => a.Module) 
       .ToList(); 

, но я использую EF 4.2 и я стараюсь, как это и смотреть на SQL Profiler, EF генерируют гораздо больше SQL запросов вложенному, я хочу только один запрос для этого задания, подобный этому

select * from Modules m join Pages p on m.ID = p.Module_ID 
order by p.AuthOrder 

как это возможно?

+0

Является ToList() операция nacessary дважды? –

+0

да, как я могу заказать навигацию? – tobias

ответ

2

запрос, как этот

select * from Modules m join Pages p on m.ID = p.Module_ID 
order by p.AuthOrder 

может быть реализован следующий способ:

var q = (from c in Context.Modules 
      join o in Context.Pages on c.ID equals o.Module_ID 
      orderby o.AuthOrder 
      select new {c, o}).ToList(); 
+0

Каков тип возврата этого типа? Мой метод: List , но он не конвертируется. – tobias

+0

Тип возврата - анонимный. Что вы хотите получить, только модули? Затем замените «новый {c, o}» на «c» в запросе выше. –

+0

да модуль спасибо – tobias

0

Вы, вероятно, ищете Include(), задающее связанный объект включить в ваш результат (т.е. таблицы, которые должны быть объединены в запросе SQL):

return this.Context.Modules.Include("Pages") 
       .Select(p => new 
       { 
        Module = p, 
        Page = p.Pages.OrderBy(c => c.AuthOrder) 

       }).ToList() 
       .Select(a => a.Module) 
       .ToList(); 

Edit: Вы уверены, ваш запрос имеет смысл? Вы на самом деле выбираете только Module, так почему вы пытаетесь заказать Pages?

+0

Я попытался, но он сгенерировал много запросов sql. – tobias

+0

Редактировать для: beacuse Страницы должны быть заказаны AuthOrder – tobias

+0

@tobias Но поскольку вы, наконец, выбираете только модуль, а не страницы, почему вы заказываете страницы? – ken2k

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