加入LINQ,避免在“new {}”中明确命名属性?

时间:2012-06-21 18:12:37

标签: linq linq-to-dataset

我想做这样的事情:

    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? 但是我想避免将它们全部列出来。

2 个答案:

答案 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 };或列出所有列。

还有很多其他主题: