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_IDと表にありVEHICLE_IDます。 fromテーブルです。Primary KeyPART_TYPEVEHICLE_IDForeign KeyVEHICLE

DATE_REFPART_TYPE_IDおよび表にVEHICLE_ID記載Primary KeyされていPART_AVAILABILITYます。 VEHICLE_IDそして テーブルからPART_TYPE_IDです。Foreign 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 に答える