具有多个联接和子查询的实体框架

时间:2019-05-03 07:22:19

标签: sql entity-framework subquery left-join

我有一个复杂的查询,其中包含多个左联接和子查询,需要在Entify Framework中实现。我已经收到了怪物SQL, 我的目标是使用EF以优雅的方式做到这一点。该查询使用多个表,并在顶部创建“ WITH”子查询 稍后包含在联接中。我已经使用EF完成了第一种方法,但是当我检查EF发送到数据库的输出时,内部联接将在以下情况下发送 我期待着加入。

SQL的摘要如下:

WITH SUB_QUERY
     AS (  SELECT FIELD_A,
                    FIELD_B,
                    FIELD_C,
             MAX (FIELD_D) MAX_FIELD_D
             FROM TABLE_X
            WHERE SOME FIELD_A = 'WHATEVER'
         GROUP BY FIELD_A, FIELD_B, FIELD_C)
SELECT C.FIELD_A,
       C.FIELD_B,
       B.FIELD_X,
       D.FIELD_S,
       E.FIELD_J,
       F.FIELD_Y
FROM TABLE_A A
       LEFT JOIN SUB_QUERY B
          ON A.FIELD_C = B.FIELD_C
       LEFT JOIN TABLE_C C
          ON B.FIELD_A = C.FIELD_A
       LEFT JOIN TABLE_D D
          ON A.FIELD_C = D.FIELD_C
       LEFT JOIN TABLE_E E
          ON     A.FIELD_X = E.FIELD_X
       LEFT JOIN TABLE_F F
          ON A.FIELD_W = F.FIELD_W

WHERE A.FIELD_H = D.FIELD_H
       AND A.FIELD_D = B.MAX_FIELD_D

如您所见,在顶部过滤器上的子查询对下面要使用的联接使用的某些数据进行分组和分组。然后所有联接都发生 某些字段取自不同的表作为查询的输出。

您会建议我采用哪种方法来完成此任务?我尝试了不同的方法,但没有一种有效(要么什么都不检索,要么比数据库上的SQL查询多得多,等等。)

请注意,实体框架中的域模型已正确设置:主键,集合,嵌套对象等。所以我相信其中一些 甚至不需要连接,因为我的EF实体已经包含了对子集合和父对象(导航属性)的引用。

非常感谢!

1 个答案:

答案 0 :(得分:0)

如果您确实需要左连接,则应在适当的on子句中设置与左连接表相关的where条件

 FROM TABLE_A A
     LEFT JOIN SUB_QUERY B
        ON A.FIELD_C = B.FIELD_C
     LEFT JOIN TABLE_C C
        ON B.FIELD_A = C.FIELD_A
     LEFT JOIN TABLE_D D
        ON A.FIELD_C = D.FIELD_C AND A.FIELD_D = B.MAX_FIELD_D 
     LEFT JOIN TABLE_E E
        ON     A.FIELD_X = E.FIELD_X
     LEFT JOIN TABLE_F F
        ON A.FIELD_W = F.FIELD_W

使用左联接表列,在该列中强制关系作为INNER JOIN工作