グループ化する複数の列を選択する場合は、次のようにしてください。
DataTable dtList = list1.Items.GetDataTable();
var grouped = from row in dtList.AsEnumerable()
group row by new { T = row["T"], U = row["U"] } into valueGroup
select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
これにより、戻りセットのフィールドでアクセス可能なプロパティT
を持つ匿名型オブジェクトとして返される複数の列が得られます。U
Value
これをテストしたところ、サンプル データ セットで動作するようです。
ここで説明されているソリューションに基づいています: http://social.msdn.microsoft.com/Forums/en-US/linqprojectgeneral/thread/54f6ac70-e74c-4d9d-a9ee-6373714c0755。
編集
句を使用group by
すると、すべてのアイテムがグループに分割され、各グループに対して 1 つのアイテムのみが返されるため、列を参照するには、それを句に入れるかgroup by
、集計メソッドを使用する必要があります (ID
フィールドで行ったように)およびMax()
方法)。
ただし、グループを作成する場合は、各グループの最大値ID
を取得してから、それらの項目の他の列を取得します(各グループの最大値を使用) 。同じテーブルでID
を使用できます。このコードは、サンプルと列join
の場合にそれを行う方法を示しています。テストデータセットで正しく動作しているようです:T
U
var dtListEnumerable = dtList.AsEnumerable();
//group items and get max ID for each group
var groupedTemp = from row in dtListEnumerable
group row by row["T"] into valueGroup
select new { Value = valueGroup.Key, ID = valueGroup.Max(id => id["ID"]) };
//join to get the rest of columns for each item with max ID returned for each group
var grouped = from groupedItem in groupedTemp
join row in dtListEnumerable on groupedItem.ID equals row["ID"]
into tablesJoined
from row in tablesJoined.DefaultIfEmpty()
select new
{
ID = groupedItem.ID,
T = row["T"],
U = row["U"]
};
これについて何か助けが必要な場合は、お知らせください。取得したいデータが返されない場合は、詳細をお知らせください。