4


私はlinqとEFのスターターです。私は4つのテーブルを持っています

通貨単位

CurrencyUnitID    CurrencyName
-------------------------------
1                    Dolar
2                    Pond

リクエスト

RequestID    WayBillNo
--------------------------
1            10000
2            10001

コストタイプ

CostTypeID      CostName
-------------------------------
1                 A
2                 B

リクエストコスト

RequestId    CostId     CurrencyUnitId     Amount   Remark
-----------------------------------------------------------
1              1              1            200
1              2              1            400
2              2              2            1000

この4つのテーブルに参加して、この結果を得たい

結果(テーブル)

RequestId  WayBillNo  CostId    CostName  CurrencyUnitId   CurrencyUnitName  Amount   Remark
------------------------------------------------------------------------------------------
1           10000        1        A          1                 Dollar       200       
1          10000        2         B          2                 Pond         400
2          10001        1         A          0                               0
2          10001        2         B          2                Pond          1000

私はこのクエリを書きます

  var items = (from rc in context.CLEARANCE_COST
                join c in context.COST_TYPES on rc.COST_ID equals c.COST_ID 
                join d in context.CLEARANCE_REQUEST on rc.REQUEST_ID equals d.REQUEST_ID
                join f in context.CURRENCY_UNITS on rc.CURRENCY_ID equals f.CURRENCY_ID 
                select new
                           {

                               rc.COST_AMOUNT,
                               c.COST_ID,
                               c.COST_NAME,
                               d.WAYBILL_NO,
                               f.CURRENCY_NAME
                           }).ToList();

しかし、この結果を取得します(Bテーブル)

RequestId WayBillNo CostId CostName CurrencyUnitId CurrencyUnitName Amount Remark


1           10000        1        A          1                 Dollar       200       
1          10000        2         B          2                 Pond         400
2          10001        2         B          2                Pond          1000

つまり、リクエストにコストがかかっていない場合、このリクエストのすべてのコストを表示し、Amount 値を 0 に設定します。たとえば、A テーブルには 4 行あり、B テーブルにはテーブル A に 3 行あり、リクエスト 2 のコストは 1 です。金額 0 を設定しますが、テーブル B には設定されていません。セットしたい。

4

4 に答える 4

6

編集

以下のように、linqで左外部結合を試してください。

var query=
    from rc in RequestCost
    join c in CostType on rc.CostId    = c.CostTypeID into RCC
    from rcc in RCC.DefaultIfEmpty() 
    join r in Request on  rc.RequestID = r.RequestID  into RCR
    from rcr in RCR.DefaultIfEmpty()   
    join cu in CurrencyUnit 
    on rc.CurrencyUnitId  = cu.CurrencyUnitID into RCCU
    from rccu in RCCU..DefaultIfEmpty() 

    select new 
       { 
          RequestId = rc.RequestId,
          WayBillNo = rcr != null ? rcr.WayBillNo : "<No WayBillNo>",
          CostId = rc.CostId,
          CostName = rcc != null ? rcc.CostName : "<No CostName>",
          CurrencyUnitID= rc.CurrencyUnitID,
          CurrencyName = rccu != null ? rccu.CurrencyName: "<No CurrencyName>",
          Amount = rc.Amount != null ? rc.Amount : 0 ,
          Remark = rc.Remark != null ? rc.Remark : "<No Remark>",
       }

したがって、テーブルに応じたクエリは次のようになります。

var query=
    from rc in RequestCost
    join c in CostType on rc.CostId    = c.CostTypeID
    join r in Request on  rc.RequestID = r.RequestID    
    join cu in CurrencyUnit on rc.CurrencyUnitId  = cu.CurrencyUnitID 

    select new 
       { 
          rc.RequestId,
          r.WayBillNo,
          rc.CostId,
          c.CostName 
          rc.CurrencyUnitID,
          cu.CurrencyName,
          rc.Amount,
          rc.Remark                     
       }

詳細については、投稿を確認してください:SQLからLINQ(視覚的表現)

画像は、結合がlinqでどのように機能するかを示しています ここに画像の説明を入力してください

于 2012-05-28T07:56:16.637 に答える
1

左外部結合の場合 (RequestCost の FK が null になる可能性があると仮定)

var query=
    from rc in RequestCost
    join c in CostType on rc.CostId equals c.CostTypeID into ctype
    join r in Request on  rc.RequestID equals r.RequestID into req
    join cu in CurrencyUnit on rc.CurrencyUnitId equals cu.CurrencyUnitID into unit

    select new 
       { 
          rc.RequestId,
          req.FirstOfDefault() != null ? req.FirstOfDefault().WayBillNo : null,
          rc.CostId,
          ctype.FirstOfDefault() != null ? ctype.FirstOfDefault().CostName : null,
          rc.CurrencyUnitID,
          ctype.FirstOfDefault() != null ? ctype.FirstOfDefault().CurrencyName : null,
          rc.Amount,
          rc.Remark                     
       }
于 2012-05-28T08:37:22.447 に答える
0

このコードを書くことができます

 var items = from c in context.COST_TYPES
                    join o in context.CLEARANCE_COST .Where(d=>d.REQUEST_ID==8) on c.COST_ID equals o.COST_ID into outer
                    from o in outer.DefaultIfEmpty()
                    select new
                               {
                                   o.CLEARANCE_REQUEST.WAYBILL_NO,
                                   c.COST_NAME,
                                   o.CURRENCY_UNITS.CURRENCY_NAME,
                                   Amount=o==null?0:o.COST_AMOUNT
                               };
于 2012-06-14T07:29:55.757 に答える