0

Linqクエリから指定されたフィールドのみを持ついくつかのDataRowsを選択し、これらのDataRowsを使用してDataTableにデータを入力しようとしています。問題は、これらのDataRowsを新しいDataTableに追加すると、IDフィールドとNameフィールドの両方にそれぞれ入力されると予想されることです。ただし、DataTableのIDフィールドには、ID値とName値の両方が含まれています。誰かが私が間違っていることを指摘できますか?

コードは次のとおりです。

var query2 = from s in Tables[Table_Sec].AsEnumerable()
             where query.Contains(s["sectype"])
             select new { id = s["id"], name = s["name"] }; // I only want these fields



DataTable dt = new DataTable();  // Create my new dataTable
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("name", typeof(string));

foreach(var row in query2)
{
  dt.Rows.Add(row);  // ID field contains both ID and Name strings. Name field contains nothing
}
4

5 に答える 5

1

DataRowコンストラクターを使用するとオブジェクト配列を渡すことができるため、これを試すことができます

var result = from s in Tables[Table_Sec].AsEnumerable()
             where query.Contains(s["sectype"])
             select new object[] 
             {
                 s["id"],
                 s["name" ]
             };

DataTable dt = new DataTable();  
dt.Columns.Add("id", typeof(string));
dt.Columns.Add("name", typeof(string));

foreach(var row in result)
{
    dt.Rows.Add(row); 
}

//編集:
この方法は列の正しい順序に大きく依存し、これが混乱する可能性がある別の状況があるかどうかさえわからないため、この方法はお勧めしません=)他のソリューションから1つを選択してください(少なくともコーディングについて)

于 2013-02-26T16:43:21.513 に答える
0

MSDNから:

DataRow newCustomersRow = dataSet1.Tables["Customers"].NewRow();

newCustomersRow["CustomerID"] = "ALFKI";
newCustomersRow["CompanyName"] = "Alfreds Futterkiste";

dataSet1.Tables["Customers"].Rows.Add(newCustomersRow);

これは、データテーブルに行を追加する方法です

だからあなたは次のようになります:

foreach(var row in query2)
{
var newRow = dt.NewRow();
newRow["id"] = row.id;
newRow["name"] = row.name;
  dt.Rows.Add(newRow);  // ID field contains both ID and Name strings. Name field contains nothing
}
于 2013-02-26T16:34:05.740 に答える
0

行内の各セルに手動で入力する必要があります。

foreach(var row in query2)
{
    var newRow = dt.NewRow();
    newRow["id"]= row.id;
    newRow["name"]= row.name;
    dt.Rows.Add(newRow);
}
于 2013-02-26T16:34:39.620 に答える
0

このメソッドのDatatableを避け、POCO、Plain OldClassObjectを使用します。

public class POCO
{
     public string id { get; set; }
     public string name { get; set; }
}

var query2 = from s in Tables[Table_Sec].AsEnumerable()
             where query.Contains(s["sectype"])
             select new POCO { id = s["id"], name = s["name"] };

POCOの利点は、データを既存のものとの関連付けから分離し、代わりに、コレクションとしてのみ機能するように存在するクラスを参照することです。

于 2013-02-26T16:35:16.630 に答える
0

あなたは問題をうまく説明していません。DataTablesただし、通常は例外(「行はすでに別のテーブルに属しています」)が発生するため、別の行に行を追加しないでください。

ReferenceEqualsオブジェクトを選択するときに誤って使用しないように、強く型付けされたフィールド拡張メソッドを使用する必要があります。が含まれている場合は、LinqクエリからCopyToDataTable新しいクエリを作成するために使用できます。DataTableIEnumerable<DataRow>

パフォーマンス上の理由から、Enumerable.Join代わりに使用します。query.Contains

var query2 = from secRow in Tables[Table_Sec].AsEnumerable()
             join sectype in query on secRow.Field<string>("sectype") equals sectype 
             select secRow;

DataTable dt = query2.CopyToDataTable();
于 2013-02-26T16:41:47.993 に答える