我想在实体框架中使用以下类型的查询
SELECT c2.*
FROM Category c1 INNER JOIN Category c2
ON c1.CategoryID = c2.ParentCategoryID
WHERE c1.ParentCategoryID is NULL
如何在Entity框架中完成上述工作......
答案 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。