2010-05-22 4 views
3

Я хочу иметь следующий вид запроса в объект кадра работыавтообъединение в Entity Framework

SELECT c2.* 
FROM Category c1 INNER JOIN Category c2 
ON  c1.CategoryID = c2.ParentCategoryID 
WHERE c1.ParentCategoryID is NULL 

Как сделать вышеупомянутую работу в рамках Entity ...

ответ

9

Ну, я не знаю, много о EF, но это выглядит примерно так:

var query = from c1 in db.Category 
      where c1.ParentCategoryId == null 
      join c2 in db.Category on c1.CategoryId equals c2.ParentCategoryId 
      select c2; 
+0

Это прекрасно. Я знаю это, но мне нужно в EF. В любом случае Спасибо ... – Waheed

+3

@Waheed: Я не знаю, что вы имеете в виду - вы должны иметь возможность использовать этот точный запрос в EF. –

+0

привет, я изменил его, чтобы вернуть список catergoyList, тогда он говорит, что вам нужно бросить. как передать var в список объект? –

2

Просто привести в порядок это до следующего немного лучше, и делает то же самое:

var query = from c1 in db.Category 
      from c2 in db.Category 
      where c1.ParentCategoryId == null 
      where c1.CategoryId == c2.ParentCategoryId 
      select c2; 
1

В EF 4.0+, LEFT JOIN синтаксис немного отличается и представляет сумасшедшую причуду:

var query = from c1 in db.Category 
     join c2 in db.Category on c1.CategoryID equals c2.ParentCategoryID 
     into ChildCategory 
     from cc in ChildCategory.DefaultIfEmpty() 
     select new CategoryObject 
     { 
      CategoryID = c1.CategoryID, 
      ChildName = cc.CategoryName 
     } 

Если вы захватываете выполнение этого запроса в SQL Server Profiler, вы увидите, что он делает на самом деле выполните LEFT OUTER JOIN. ОДНАКО, если у вас есть несколько предложений LEFT JOIN («Group Join») в вашем запросе Linq-to-Entity, я обнаружил, что предложение self-join действительно может выполняться как в INNER JOIN - ДАЖЕ ЕСЛИ ВЫШЕ СИНТАКСИС ИСПОЛЬЗУЕТСЯ!

Разрешение на это? Как сумасшедший, и, по мнению MS, это звучит неправильно, я решил это, изменив порядок предложений соединения. Если предложение LEFT JOIN с саморегуляцией было первым объединением Linq Group, SQL Profiler сообщила о INNER JOIN. Если предложение LEFT JOIN для саморегуляции было LAST Linq Group Join, SQL Profiler сообщила о LEFT JOIN.

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