6

私はこのようなことをしたいと思います:

    DataTable q = from c in customers
            join o in orders on c.Key equals o.Key
            into outer
            from j in outer.DefaultIfEmpty()
            select new { c.*, j.* };

私が現在得た最も近いものは次のとおりです。

    var q = from c in customers
            join o in orders on c.Key equals o.Key
            into outer
            from j in outer.DefaultIfEmpty()
            select new { c, j };

結果 (q) に c と j のすべての列を含めたいと思います。c と j の両方に多くの列が含まれているため、それらをそのようにリストしたくありません。

            select new { c.col1, c.col2, etc. }

しかし、基本的には、最終的な DataTable を c.* と j.* で構成したいと考えています。

この回答 (受け入れられた回答ではなく、その下の回答) は、「select new」内のすべての c 列と j 列を指定すると機能します: How to Convert a LINQ result to DATATABLE? しかし、それらすべてをリストすることは避けたいと思います。

4

2 に答える 2

1

まず、列を手動で指定することをお勧めします。これは、基礎となるレイヤー (データベース スキーマ、クエリ プロバイダー) がアプリケーションに与える影響を最小限に抑えたいからです。しかし、本当にこれをやりたいのであれば、それを達成するためのちょっとしたハックな方法があります。

エンティティ フレームワークを使用している場合 (最初にデータベース):

var qs = ((ObjectQuery)q).ToTraceString();
var ds = new DataSet();
var da = new SqlDataAdapter(qs, new SqlConnection(((EntityConnection)context.Connection).StoreConnection.ConnectionString));
da.Fill(ds, "Result");

アイデアは、実際に実行される前に発行された SQL をキャッチし、それを使用して a DataTable(in a DataSet) を埋めることです。

Linq-to-sql は基本的に同じですが、コマンド文字列と接続文字列を取得する方法が異なります。

context.GetCommand(q).CommandText
context.Connection.ConnectionString

EFコードファーストの場合:

q.ToString()
context.Database.Connection.ConnectionString
于 2012-06-24T14:54:40.397 に答える
0

それは不可能だと思います。これは、質問で示した方法でのみ実行できselect new { c, j };ます。または、すべての列を一覧表示することによって実行できます。

これには他にも多くのスレッドがあります:

于 2012-06-23T23:04:49.490 に答える