9

私はdatatablec#のaで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();
4

5 に答える 5

10

新しい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);
}
于 2013-01-21T02:26:35.643 に答える
8

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

DataTable checkedParams = mainDataTable.Select("checked = true").CopyToDataTable()
.DefaultView.ToTable(false, "lagerID", "reservePeriod", "discount");
于 2013-02-18T16:01:17.537 に答える
8

Linqを使用してDataTable、DataSetにアクセスするための完璧なアイデアを得るのに役立つAccessDataTableの最も簡単な方法を試してください...

次の例を考えてみましょう。次のような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クエリを実行することもできます…</ p>

于 2013-04-07T13:54:13.070 に答える
7

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

したがって、DataTableから特定の列を選択するのに最適なのは、DataViewを使用して列をフィルタリングし、必要に応じて使用することです。

これを行う方法をここで見つけてください。

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

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

于 2014-01-20T07:04:21.870 に答える
3

selectステートメントは、DataRowsのシーケンスではなく、匿名タイプのシーケンスを返します。CopyToDataTable()は、 isまたはから派生したIEnumerable<T>場所でのみ使用できます。行オブジェクトを選択して、その上でCopyToDataTableを呼び出すことができます。TDataRowr

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();

ジェネリック型TがDataRowではない場合にCopyToDataTableを実装することもできます。

于 2013-01-20T08:03:05.003 に答える