web-dev-qa-db-ja.com

DataTableのLinq:テーブル全体ではなく、特定の列をデータテーブルに選択します

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();
9
Uri Klar

新しい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);
}
10
OJ Raqueño

ここでは、mainDataTableから3つの特定の列のみを取得し、フィルターを使用します

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
8
Leax

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クエリを実行することもできます…

7
Sagar Upadhyay

LINQは、DataTableではなくListで非常に効果的で使いやすいです。上記の回答にはループ(for、foreach)があることがわかりますが、これは好ましくありません。

したがって、DataTableから特定の列を選択する最良の方法は、DataViewを使用して列をフィルター処理し、必要に応じて使用することです。

これを行う方法はこちらをご覧ください。

DataView dtView = new DataView(dtYourDataTable);
DataTable dtTableWithOneColumn= dtView .ToTable(true, "ColumnA");

これで、DataTable dtTableWithOneColumnには1つの列(ColumnA)のみが含まれます。

6
Tapan kumar

Selectステートメントは、DataRowのシーケンスではなく、匿名型のシーケンスを返しています。 CopyToDataTable()は、IEnumerable<T>でのみ使用できます。ここで、TDataRowから派生したものです。行オブジェクトで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ではない場合も可能です。

3
Adil