繁体   English   中英

C#LINQ连接错误

[英]C# LINQ Join Error

SELECT     PART_TYPE.PART_TYPE_ID,
           PART_TYPE.PART_TYPE_NAME,                       
           PART_AVAILABILITY.DATE_REF, 
           PART_TYPE.VEHICLE_ID,
           PART_AVAILABILITY.AVAIL_COUNT

FROM  PART_AVAILABILITY
RIGHT JOIN PART_TYPE
ON PART_AVAILABILITY.PART_TYPE_ID = PART_TYPE.PART_TYPE_ID
AND PART_AVAILABILITY.VEHICLE_ID = PART_TYPE.VEHICLE_ID 
where PART_TYPE.VEHICLE_ID = 366

PART_TYPE_IDVEHICLE_IDPART_TYPE表中的Primary Key VEHICLE_ID是来自VEHICLE表的Foreign Key

DATE_REFPART_TYPE_IDVEHICLE_IDPART_AVAILABILITY表中的Primary Key VEHICLE_IDPART_TYPE_IDPART_TYPE表中的Foreign Key

上面的查询给出了下面的输出。

PART_TYPE_ID    PART_TYPE_NAME  DATE_REF                 VEHICLE_ID  AVAIL_COUNT
5               A1              2013-06-20 00:00:00.000  366         1
6               B1              2013-06-20 00:00:00.000  366         2
7               C1              2013-06-20 00:00:00.000  366         1
8               D1              NULL                     366         NULL
9               E1              NULL                     366         NULL
16              F1              2013-06-20 00:00:00.000  366         1

这是我上面的sql查询的linq查询。

var vehiclePartType = from pa in context.PART_AVAILABILITY
                    join pt in context.PART_TYPE
                    on pa.PART_TYPE_ID equals pt.PART_TYPE_ID into joined
                    from j in joined.DefaultIfEmpty()
                    where j.VEHICLE_ID == 366
                    select new
                    {
                        PART_TYPE = j,
                        PART_AVAILABILITY = pa
                    };

但是linq查询给出了以下输出。

PART_TYPE_ID    PART_TYPE_NAME  DATE_REF                 VEHICLE_ID  AVAIL_COUNT
5               A1              2013-06-20 00:00:00.000  366         1
6               B1              2013-06-20 00:00:00.000  366         2
7               C1              2013-06-20 00:00:00.000  366         1
16              F1              2013-06-20 00:00:00.000  366         1

NULL记录丢失。

我该如何解决?

LINQ中的Right Join是通过反转join语句完成的,因此正确的选择是:

var vehiclePartType = from pt in context.PART_TYPE
                      join pa in context.PART_AVAILABILITY on pt.PART_TYPE_ID equals pa.PART_TYPE_ID into joined
                      from j in joined.DefaultIfEmpty()
                      where pt.VEHICLE_ID == 366
                      select new
                      {
                          PART_TYPE = pt,
                          PART_AVAILABILITY = j
                      };

我认为您必须交换表。 实际上,您正在执行的操作是左连接。 要转换成正确的,只需交换表,如::

  {
                      var vehiclePartType = from 
                        pt in context.PART_TYPE join pa in context.PART_AVAILABILITY
                        on pt.PART_TYPE_ID equals pa.PART_TYPE_ID   into joined
                        from j in joined.DefaultIfEmpty()
                        where j.VEHICLE_ID == 366
                        select new
                        {
                            PART_TYPE = j,
                            PART_AVAILABILITY = pa
                        };
    }

我对LINQ不太熟悉,但是在您的SQL查询中

AND PART_AVAILABILITY.VEHICLE_ID = PART_TYPE.VEHICLE_ID

这在您的LINQ查询中丢失。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM