8

私はこのようなテーブルを持っています:

EmployeeId  EmployeeName ItemName
4           Ganesh       Key Board
4           Ganesh       Processor
1           Jignesh      Key Board
1           Jignesh      Mouse
1           Jignesh      Processor
3           Rakesh       Key Board
2           Tejas        Key Board
2           Tejas        Mouse
2           Tejas        Processor

employeeidアイテム名が同じで異なるかのようにこれを照会する必要employeenameがあり、アイテムを「、」で区切る必要があります。

以下に示すもののように:

EmployeeId  EmployeeName ItemName
1           Jignesh      Key Board, Mouse, Processor
2           Tejas        Key Board, Mouse, Processor
3           Rakesh       Key Board
4           Ganesh       Key Board, Processor

これに対する SQL クエリは次のとおりです。 OCRできなかったSTUFFハックのOPs Screen Scrape

上記の SQL クエリをラムダ式に変換するのを手伝ってくれる人はいますか?

4

1 に答える 1

14

Lambda expressionLinq ステートメント (EF または Linq2Sql など) を意味していると思います。

FOR XML PATH示されている例は、 Sql ServerまたはSTUFFの欠如を回避するためのハックです。最後にSql 2017にはSTRING_AGGがありますGROUP_CONCATLISTAGG

LINQ でハックを再現する必要はまったくありません。代わりに、関心のある従業員のセットのすべての行をメモリにロードしGroupBy、必要なキーをString.Join選択してから、選択したプロジェクションで使用します。

var result = db.EmployeeItems
      // If you have a filter add the .Where() here ...
      .GroupBy(e => e.EmployeeId)
      .ToList()
      // Because the ToList(), this select projection is not done in the DB
      .Select(eg => new 
       {
          EmployeeId = eg.Key,
          EmployeeName = eg.First().EmployeeName,
          Items = string.Join(",", eg.Select(i => i.ItemName))
       });

employeeItemsの間の結合の射影はどこにありますか:EmployeeItems

var employeeItems = new []
{
   new EmployeeItem{EmployeeId = 1, EmployeeName = "Ganesh", ItemName = "Keyboard"},
   new EmployeeItem{EmployeeId = 1, EmployeeName = "Ganesh", ItemName = "Mouse"},
   new EmployeeItem{EmployeeId = 2, EmployeeName = "John", ItemName = "Keyboard"}
};

結果:

1 Ganesh Keyboard,Mouse
2 John   Keyboard
于 2015-05-05T06:12:10.650 に答える