1

を必要とするプロジェクトに取り組み始めたばかりで、Linq to Sqlクエリを実行してデータを取得することができました。しかし今DataTable、私は取得しているデータでを埋める必要があります。

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

MyDatabase db = new MyDatabase();
var query = from cust in db.Customers
            where cust.CustomerName != "Dante"
            orderby cust.CustomerName
            select new { Name = cust.CustomerName }; 

だから、私は私のクエリの内容をにコピーする必要があったので、Datatable私はこれを試しました

 IEnumerable<DataRow> query =
    from order in orders.AsEnumerable()
    where order.Field<DateTime>("OrderDate") > new DateTime(2001, 8, 1)
    select order;

// Create a table from the query.
DataTable boundTable = query.CopyToDataTable<DataRow>();

次に、私のコードは次のようになります。

IEnumerable<DataRow> myQuery = from cust in db.Customers.AsEnumerable()
                    where cust.Name != "Dante"
                    orderby cust.Name
                    select new { Name = cust.Name };

DataTable myDataTable = myQuery.CopyToDataTable<DataRow>();

しかし、このコードを使用すると、コンパイラはエラーを発生させます。

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<AnonymousType#1>' to 'System.Collections.Generic.IEnumerable<System.Data.DataRow>

エラーはそのselect単語で発生します。

だから、私は何が間違っているのですか?この変換の問題を回避するにはどうすればよいですか?

誰かが私を助けてくれることを願っています、事前に感謝します。

4

3 に答える 3

4

DataTable以外の結果からを作成する方法がありますがIEnumerable<DataRow>、それはかなり複雑です。ジェネリック型TがDataRowではない場合にCopyToDataTableを実装します

ただし、あなたの場合は、次のようにすることをお勧めします。元のクエリに戻ります。

MyDatabase db = new MyDatabase();
var query = from cust in db.Customers
            where cust.CustomerName != "Dante"
            orderby cust.CustomerName
            select new { Name = cust.CustomerName };

次に、単一のフィールドを定義します。これは、DataTable最終的にを作成するときにDataRow、以下から機能するスキーマが必要になるためです。

DataTable myDataTable = new DataTable();
myDataTable.Columns.Add(
    new DataColumn()
    {
        DataType = System.Type.GetType("System.String"),
        ColumnName = "Name"
    }
);

最後に、クエリの結果を確認し、を手動でに追加DataRowsしますDataTable

foreach (var element in query)
{
    var row = myDataTable.NewRow();
    row["Name"] = element.Name;
    myDataTable.Rows.Add(row);
}
于 2012-09-05T23:40:13.863 に答える
3

問題は、エラーの状態とまったく同じです。「select」句は、1つのメンバー「Name」を持つ匿名タイプのインスタンスを作成しています。この匿名型はDataRowではなく、DataRowにすることもできないため、クエリが生成するものと設定する変数との間の暗黙的な変換は失敗します。

代わりに、このクエリを実行し、返される匿名タイプの要素ごとに、DataTableの新しいDataRowとして値を追加する必要があります。新しいDataRowを最初から作成するだけでは不十分です。DataRowクラスには、DataRowに必要な列を定義するためのコンテキスト、つまり親DataTableが必要です。

于 2012-09-05T20:58:21.150 に答える
1

これは私が推測するだろう

var myQuery = from cust in db.Customers.AsEnumerable()
                    where cust.Name != "Dante"
                    orderby cust.Name
                    select new { Name = cust.Name };

またはこれを試してください

 string[] myQuery = db.Customers.Rows
                       .Cast<DataRow>()
                       .Where(r=>r.Name!="Dante")
                       .Orderby(r=>r.Name)
                       .Select(r=>r.Field<string>("Name"))
                       .ToArray()
于 2012-09-05T20:57:00.487 に答える