C#のdatatable
でLINQクエリを実行しています。
行全体ではなく特定の列を選択し、datatable
に結果を入力します。どうやってやるの??
私のコード:
public DataTable getConversions(string c_to, string p_to)
{
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
新しいDataTableに含まれる列の数が事前にわかっている場合は、次のようなことができます。
DataTable matrix = ... // get matrix values from db
DataTable newDataTable = new DataTable();
newDataTable.Columns.Add("c_to", typeof(string));
newDataTable.Columns.Add("p_to", typeof(string));
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == "foo" &&
r.Field<string>("p_to") == "bar"
let objectArray = new object[]
{
r.Field<string>("c_to"), r.Field<string>("p_to")
}
select objectArray;
foreach (var array in query)
{
newDataTable.Rows.Add(array);
}
ここでは、mainDataTableから3つの特定の列のみを取得し、フィルターを使用します
DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
DataTableにアクセスする最も簡単な方法 を試してください.
次の例を考えてみましょう。次のようなDataTableがあるとします。
DataTable ObjDt = new DataTable("List");
ObjDt.Columns.Add("WorkName", typeof(string));
ObjDt.Columns.Add("Price", typeof(decimal));
ObjDt.Columns.Add("Area", typeof(string));
ObjDt.Columns.Add("Quantity",typeof(int));
ObjDt.Columns.Add("Breath",typeof(decimal));
ObjDt.Columns.Add("Length",typeof(decimal));
上記はDatTableのコードです。ここでは、このDataTableで利用可能なデータがあると仮定し、以下に示すようにデータを処理して特定のグリッドビューをバインドする必要があります。
エリア| 数量| ブレス| 長さ| 価格=数量*呼吸*長さ
必要に応じて正確な結果が得られる次のクエリを実行する必要があります。
var data = ObjDt.AsEnumerable().Select
(r => new
{
Area = r.Field<string>("Area"),
Que = r.Field<int>("Quantity"),
Breath = r.Field<decimal>("Breath"),
Length = r.Field<decimal>("Length"),
totLen = r.Field<int>("Quantity") * (r.Field<decimal>("Breath") * r.Field<decimal>("Length"))
}).ToList();
このデータ変数をデータソースとして割り当てるだけです。
この単純なLinqクエリを使用することで、すべての受け入れを取得でき、これを使用して他のすべてのLINQクエリを実行することもできます…
LINQは、DataTableではなくListで非常に効果的で使いやすいです。上記の回答にはループ(for、foreach)があることがわかりますが、これは好ましくありません。
したがって、DataTableから特定の列を選択する最良の方法は、DataViewを使用して列をフィルター処理し、必要に応じて使用することです。
これを行う方法はこちらをご覧ください。
DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");
これで、DataTable dtTableWithOneColumnには1つの列(ColumnA)のみが含まれます。
Selectステートメントは、DataRowのシーケンスではなく、匿名型のシーケンスを返しています。 CopyToDataTable()は、IEnumerable<T>
でのみ使用できます。ここで、T
はDataRow
から派生したものです。行オブジェクトでr
を選択して、そのオブジェクトでCopyToDataTableを呼び出すことができます。
var query = from r in matrix.AsEnumerable()
where r.Field<string>("c_to") == c_to &&
r.Field<string>("p_to") == p_to
select r;
DataTable conversions = query.CopyToDataTable();
CopyToDataTableを実装する Generic Type TがDataRowではない場合も可能です。