2016-08-24 7 views
-4

C#の下の2つのリストに参加するためのLINQステートメントを作成しようとしています。以下のシナリオのC#LINQステートメント

のList1:

FormID FormRound 
2  1 
2  2 
2  3 
3  1 
4  2 

LIST2:

FormID FormRound Category Date 
2   1  Test1  23-Aug 
2   1  Test2  24-Aug 
2   1  Test3  25-Aug 
2   2  Test1  26-Aug 
2   2  Test3  27-Aug 
3   1  Test1  28-Aug 
3   1  Test2  29-Aug 
3   1  Test3  30-Aug 

私は以下のように出力を取得する必要があります。

FormID FormRound Test1Date Test2Date Test3Date 
2   1   23-Aug 24-Aug  Test3 
2   2   26-Aug NA   27-Aug 
3   3   28-Aug 29-Aug  NA 

誰でもLINQ声明の枠組みにお役立てください。

このLINQクエリは次のようになります
+0

リスト形式は読みにくいですが、別の区切り文字を使用してコードブロックに改行して読みやすくすることはできますか? –

+1

あなたの 'Test3Date'カラムの下の最初のエントリは' Test-Date'ではなく '25-Aug'でなければなりません。そして、FormID = 3の 'FormRound'は' 3'ではなく '1'でなければなりません、そうですか? 'Test3Date'の最後の日付は' 30-Aug'でしょうか?そうでない場合、あなたの結果は不可能です。 –

+0

'List1'とは何ですか?私の見たところから、あなたの出力は 'List2'だけを使って作ることができます。また、@Cᴏʀʏという名前の不一致も指摘しました。 – Andrew

答えて

0

あなたのサンプルデータを使用して、
var results = (from a in list1 
       join b in list2 on new { a.FormId, a.FormRound } equals new { b.FormId, b.FormRound } 
       group b by new { a.FormId, a.FormRound } into c 
       select new 
       { 
        c.Key.FormId, 
        c.Key.FormRound, 
        Test1Date = c.Where(d => d.Category == "Test1").Select(e => e.Date).FirstOrDefault(), 
        Test2Date = c.Where(d => d.Category == "Test2").Select(e => e.Date).FirstOrDefault(), 
        Test3Date = c.Where(d => d.Category == "Test3").Select(e => e.Date).FirstOrDefault(), 
       }); 

は、生産:

2 1 23-Aug 24-Aug 25-Aug 
2 2 26-Aug null 27-Aug 
3 1 28-Aug 29-Aug 30-Aug 

これはまさにあなたの期待される結果ではありませんが、私はあなたといくつかの問題があると思いますあなたの質問に対する私のコメントに基づいてあなたが期待していること。

+0

'list1'を結びつけるのは役に立ちますか? – Andrew

+0

'list1'に' FormId' = 4のエントリがあり、 'list2'には存在しないためです。それらをフィルタリングすることにより、フィルタリングされます。 –

+0

まあ、 'list1'を無視しても何も変わりません。たぶん 'list1'に' 2 - 2'がなく、2行目が結果に表示されない場合は、何らかの使い方があります。 – Andrew

関連する問題