Самостоятельное присоединение в Entity Framework - PullRequest
3 голосов
/ 22 мая 2010

Я хочу иметь следующий тип запроса в работе фрейма сущности

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

Как выполнить вышеуказанную работу в Entity Framework ...

Ответы [ 3 ]

9 голосов
/ 22 мая 2010

Ну, я мало знаю об 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;
2 голосов
/ 09 апреля 2012

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

var query = from c1 in db.Category
            from c2 in db.Category
            where c1.ParentCategoryId == null
            where c1.CategoryId == c2.ParentCategoryId
            select c2;
1 голос
/ 01 августа 2012

В 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. ОДНАКО, если в вашем запросе Linq-to-Entity есть несколько предложений LEFT JOIN ("Group Join"), я обнаружил, что предложение self-join МОЖЕТ фактически выполняться как в INNER JOIN - ДАЖЕ ЕСЛИ ИСПОЛЬЗУЕТСЯ ВЫШЕ СИНТАКС! 1004 *

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

...