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 列,则此答案(不是已接受的答案,而是其下方的答案)有效: 如何将 LINQ 结果转换为 DATATABLE? 但我想避免将它们全部列出。

4

2 回答 2

1

首先,我更愿意手动指定列,因为我想尽量减少底层(数据库模式、查询提供程序)对我的应用程序的影响。但是,如果您真的想这样做,则可以使用一些 hacky 方法来完成它。

当您使用实体框架(数据库优先)时:

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 回答