В 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.