【问题标题】:Self join in Entity Framework实体框架中的自联接
【发布时间】:2010-05-22 10:49:44
【问题描述】:

我想在实体框架中进行以下类型的查询

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

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

【问题讨论】:

    标签: c# entity-framework entity


    【解决方案1】:

    好吧,我对 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;
    

    【讨论】:

    • @Waheed:我不明白你的意思——你应该能够在 EF 中使用那个确切的查询。
    • 你好,我已将其更改为返回 List CatergoyList 然后它说你需要投射。如何将 var 转换为 List 对象?
    • @SHEKHARSHETE:你不强制转换它,因为结果不是 List<Category> - 你调用ToList(),例如return query.ToList();
    • 我假设“我需要 EF”,他可能是指 LINQ 表达式。
    • @Ellesedil:嗯,这是一个 LINQ 表达式。您认为这 不是 LINQ 表达式的哪一方面?
    【解决方案2】:

    只是为了整理一下,下面会更好一些,并且做同样的事情:

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

    【讨论】:

      【解决方案3】:

      在 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 中一样执行 - 即使使用了上述语法!

      解决方案?根据 MS 的说法,这听起来很疯狂,而且听起来是错误的,但我通过更改连接子句的顺序解决了这个问题。如果自引用 LEFT JOIN 子句是第一个 Linq Group Join,SQL Profiler 报告一个 INNER JOIN。如果自引用 LEFT JOIN 子句是 LAST Linq Group Join,SQL Profiler 会报告一个 LEFT JOIN。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多