1

私は次のようにsqlServerに3つのテーブルを持っています:

Cost_Types

Id   COST_NAME
-------------
1      A
2      B
3      C
4      D
5      E
6      F
7      Z

およびリクエストテーブル

Id   No
----------
1     100
2     200
3     300

およびCost_Request(=clearance_cost)

RequestId     CostId   Amount
-------------------------------
1               2       200
1               3       400

この結果を取得したい

RequestId     CostId   Amount
    -------------------------------
    1               2       200
    1               3       400
    1               1        0
    1               4        0
    1               5        0
    1               6        0

私はこのコードを書きます

var context = new CLEARANCEEntities();
        var items = (from c in context.COST_TYPES
                     join t in context.CLEARANCE_COST
                         on c.COST_ID equals t.COST_ID into outer
                     from t in outer.DefaultIfEmpty()
                     where t. RequestId==1
                     select new
                          {
                            c.COST_ID,
                            c.COST_NAME, I = ((t == null) ? 0 : t.COST_AMOUNT)
                          }).ToList();

このコードはこれを返すだけです

    RequestId     CostId   Amount
    -------------------------------
    1               2       200
    1               3       400

クエリを次のように変更したい場合:

var context = new CLEARANCEEntities();
            var items = (from c in context.COST_TYPES
                         join t in context.CLEARANCE_COST
                             on c.COST_ID equals t.COST_ID into outer
                         from t in outer.DefaultIfEmpty()
                         where t.RequestId==2               
                         select new
                                    {
                                        c.COST_ID,
                                        c.COST_NAME, I = ((t == null) ? 0 : t.COST_AMOUNT)
                                    }).ToList();

このデータを返す

 RequestId     CostId   Amount
    -------------------------------
    2               1      0
    2               2      0
    2               3      0
    2               4      0
    2               5      0
    2               6      0

私を助けてください。皆さんありがとう

4

3 に答える 3

5

LEFTJOIN'ingのGroupJoin->SelectMany->DefaultIfEmptyテクニックが人気があることは知っていますが、SelectMany->NavigationPropertyJoin->DefaultIfEmptyテクニックの方がはるかに明確だと思います。

var query =
  from c in context.CostTypes
  from xr in c.CostRequests
    .Where(xrRecord => xrRecord.RequestId == 1)
    .DefaultIfEmpty()
  select new {
    CostType = c,
    Amount = xr == null ? 0 : xr.Amount
  }
于 2012-05-27T17:06:06.500 に答える
2

質問の異なる理解に達した後、答えを完全に修正します:

新しい答え

WHERE条件をJOIN句に移動してみてください。

あなたは内部結合を行っていません-したがって、結合の条件はここでは問題なく、一致する場合はnullを削除しません。しかし、t.RequestId == whatをwhere句に入れると、それらを除外しただけです。

OLD ANSWER -INCORRECT- ANSWERED WRONG QUESTION CostIdとRequestIdがCost_Requestテーブルへの挿入でスワップされたようです。そのため、左結合を実行し、c.COST_IDはt.COST_IDと同じですが、t.COST_IDには実際にRequestIdが含まれています。テーブル内の実際のデータ。これはあなたが見ている結果セットを完全に説明するでしょう。この理論をテストするには、参加を次のように変更します

c.COST_ID equals t.REQUEST_ID 

期待する結果が得られるかどうかを確認します。エンティティモデルが表示されない場合でも、提供されたクエリが提供されたテーブルの名前と一致せず、推測を行っているため、これは困難です。

于 2012-05-27T13:43:08.213 に答える
1

where t == 1私には、ステートメントで他のすべての行を除外しているように見えます。その段階で何tをフィルタリングできるかわかりません。clearence_cost.request_idに対応しているようです。

where句なしでクエリを試しましたか?

また、selectステートメントの内容は非常に混乱しています。

 select new
         {
            c.COST_ID,
            c.COST_NAME, 
            I = ((t == null) ? 0 : t.COST_AMOUNT)
          }

「期待される」結果セットを見ると、c.Cost_id == requestId?、c.CostName == cost_id?Cost_nameとは何ですか?

そして正直なところ、この問題への答えが必要な場合は、最初に時間をかけて投稿の混乱を片付ける必要があります。名前が違う理由を人々が推測し、あなたが何を意味するのかを魔法のように知っていると期待することはできません。

于 2012-05-27T14:38:40.770 に答える