IEnumerable<DataRow> query = from rowA in tableA.AsEnumerable() where rowA.Field<int>("col1") < 10 orderby rowA.Field<int>("col2") descending select rowA;
メソッド構文では、次のようにします。
IEnumerable<DataRow> enumA = tableA.AsEnumerable();
IEnumerable<DataRow> query1
= enumA.Where(rowA => rowA.Field<int>("col1") < 10);
IEnumerable<DataRow> query2
= query1.OrderByDescending(rowA => rowA.Field<int>("col2"));
Join()メソッドによる結合は、次のようにします。メソッド ベースのクエリ構文例:結合 (LINQ to DataSet) - ADO.NET | Microsoft Learn
IEnumerable<DataRow> enumA = tableA.AsEnumerable();
IEnumerable<DataRow> enumB = tableB.AsEnumerable();
var query = enumA.Join(
enumB,
rowA => rowA["id"],
rowB => rowB["id"],
(a, b) => new { RowA = a, RowB = b });
このとき戻り値の型を明示したいならば、それ用のクラスを定義します。
class MyDataRow
{
public DataRow RowA { get; set; }
public DataRow RowB { get; set; }
}
そしてEnumerable.Join()の第4引数でその型を指定します。なお、ここでオブジェクトの生成時に用いている構文は、オブジェクト初期化子です。
IEnumerable<MyDataRow> query = enumA.Join(
enumB,
rowA => rowA["id"],
rowB => rowB["id"],
(a, b) => new MyDataRow { RowA = a, RowB = b });
子テーブルをjoinで結合した上で、その行の値を条件に選択します。c# - DataSet select parent rows where child rows contains x value - Stack Overflow
IEnumerable<DataRow> query =
from rowA in tableA.AsEnumerable()
join rowB in tableB.AsEnumerable() on rowA["id"] equals rowB["id"]
where rowB.Field<int>("col1") > 10
select rowA;
またはサブクエリ (sub-query) で選択します。複合 from 句 - from 句 - C# リファレンス | Microsoft Learn
IEnumerable<DataRow> query =
from rowA in tableA.AsEnumerable()
from rowB in rowA.GetChildRows(dataRelation)
where rowB.Field<int>("col1") > 10
select rowA;
またはDataRowの子の行で判定するメソッドを用意し、それをwhere句から呼び出します。
IEnumerable<DataRow> query =
from rowA in tableA.AsEnumerable()
where Method(rowA, "col1", 10)
select rowA;
子テーブルをjoinで結合し、さらにそれで孫テーブルも同様に結合します。mysql - SQL query to select only grandchildren - Stack Overflow
IEnumerable<DataRow> query =
from rowA in tableA.AsEnumerable()
join rowB in tableB.AsEnumerable() on rowA["idA"] equals rowB["idA"]
join rowC in tableC.AsEnumerable() on rowB["idB"] equals rowC["idB"]
where rowC.Field<int>("col1") > 10
select rowA;
orderby句で並べ替えられます。
LINQのクエリのAsDataView()から、DataViewを作成できます。DataView - Creating a DataView Object (LINQ to DataSet) | Microsoft Learn
public static System.Data.DataView AsDataView<T> ( this System.Data.EnumerableRowCollection<T> source ) where T : System.Data.DataRow;AsDataView<T>(EnumerableRowCollection<T>) - DataTableExtensions.AsDataView Method (System.Data) | Microsoft Learn
クエリにAsDataView()を適用するには、それがEnumerableRowCollection<T>である必要があります。もしそれがIEnumerable<T>ならばCopyToDataTable()でコピーを作成できますが、値がコピーされるため、それへの修正は元のTableへは反映されません。Binding to lists of DataRows – SLaks.Blog
public static System.Data.DataTable CopyToDataTable<T> (
this System.Collections.Generic.IEnumerable<T> source
) where T : System.Data.DataRow;
CopyToDataTable<T>(IEnumerable<T>) - DataTableExtensions.CopyToDataTable Method (System.Data) | Microsoft Learn
またDataRelationが設定されているとき、CopyToDataTable()で作成されたDataTableに、それは含まれません。
クエリからのDataViewの作成が困難ならば、元のDataTableからDataViewを作成し、そのRowFilterプロパティで結果をフィルタします。
List<int> ids = new List<int>();
foreach (DataRow dataRow in query)
{
ids.Add((int)dataRow["id"]);
}
DataView view = new DataView();
view.Table = dataTable;
view.RowFilter = String.Format("id IN ({0})", String.Join(",", ids));