我想做这样的事情:
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? 但是我想避免将它们全部列出来。
答案 0 :(得分: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并使用它来填充DataTable
(在DataSet
中)。
与Linq-to-sql基本相同,只是获取命令字符串和连接字符串的方式不同:
context.GetCommand(q).CommandText
context.Connection.ConnectionString
使用EF Code-first:
q.ToString()
context.Database.Connection.ConnectionString
答案 1 :(得分:0)
我认为这是不可能的。您只能按照问题中显示的方式执行此操作:select new { c, j };
或列出所有列。
还有很多其他主题: