自我加入实体框架

时间:2010-05-22 10:49:44

标签: c# entity-framework entity

我想在实体框架中使用以下类型的查询

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

如何在Entity框架中完成上述工作......

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

为了整理这一点,以下内容更好一些,并做同样的事情:

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

答案 2 :(得分: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。但是,如果在Linq-to-Entity查询中有多个LEFT JOIN(“Group Join”)子句,我发现自连接子句实际上可以像INNER JOIN一样执行 - 即使使用了上面的语法! / p>

对此的决议?疯了,据MS说,听起来不对,我通过改变连接子句的顺序来解决这个问题。如果自引用LEFT JOIN子句是第一个Linq Group Join,则SQL事件探查器报告了一个INNER JOIN。如果自引用LEFT JOIN子句是LAST Linq Group Join,则SQL事件探查器会报告LEFT JOIN。