0
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_ID在表中 Primary Key。是一个从表。PART_TYPEVEHICLE_IDForeign KeyVEHICLE

DATE_REFPART_TYPE_ID并且VEHICLE_ID在表中 Primary Key。并且 来自表。PART_AVAILABILITYVEHICLE_IDPART_TYPE_IDForeign KeyPART_TYPE

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

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

这是我linq对上述 sql 查询的查询。

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记录丢失。

我该如何解决这个问题?

4

3 回答 3

3

LINQ 中的右连接是通过反转连接语句来完成的,因此正确的连接是这样的:

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
                      };
于 2013-06-25T07:01:24.597 回答
1

我认为你必须交换你的桌子。实际上,您正在做的是 left 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 j.VEHICLE_ID == 366
                        select new
                        {
                            PART_TYPE = j,
                            PART_AVAILABILITY = pa
                        };
    }
于 2013-06-25T07:01:54.947 回答
0

我对 LINQ 不太熟悉,但在你的 SQL 查询中你有

AND PART_AVAILABILITY.VEHICLE_ID = PART_TYPE.VEHICLE_ID

这在您的 LINQ 查询中缺失。

于 2013-06-25T06:59:16.047 回答