使用LINQ,我怎样才能得到一个连接表返回为IEnumerable

问题描述 投票:1回答:1

我用SQL了很多,我想同样的逻辑连接传送到LINQ查询对一个DataSet。 DataSet是表的一帮其拉从SQL查询进一步向上行。

我设法得到这个工作一起 -

        IEnumerable<DataRow> query =
            from a in ds.Tables["Names"].AsEnumerable()
            join b in ds.Tables["NameHasAffiliate"].AsEnumerable()
                on a.Field<int>("PK") equals b.Field<int>("fk_MainTable_PK")
            select a;

这并不编译:

select a.Field<int>("PK"), a.Field<string>("Name")

并且也不

select new { PK = a.Field<int>("PK"), Name = a.Field<string>("Name") }

这肯定正确的查询(我看行预期的数量和复制表a数据),但是这仅仅是返回表a列 - 显然是因为select a的。

我试图改变到select new { a, b }也包裹在()查询最多在末尾添加一个.ToList(),但既不编译aftewards用给我查询了IEnumerable版本简单converstion表

DataTable boundTable = query.CopyToDataTable<DataRow>();

我如何可以选择所有这样的列?或者说,如果我加入了很多的表,我怎么能指定每个表中的列?

c# linq
1个回答
0
投票

这是因为返回比DataRow其他什么也不会在你的榜样工作,因为你所定义的查询是类型IEnumerable<DataRow>的。所以,如果你正在返回字段的字段或集合,然后你需要改变的预期收益类型。

我尝试以下和它工作得很好。

var ds = new DataSet();

ds.Tables.Add("Names");
ds.Tables["Names"].Columns.Add("PK", typeof(Int32));
ds.Tables["Names"].Columns.Add("Name", typeof(String));
ds.Tables["Names"].Rows.Add("1", "NameValue1");

ds.Tables.Add("NameHasAffiliate");
ds.Tables["NameHasAffiliate"].Columns.Add("fk_MainTable_PK", typeof(Int32));
ds.Tables["NameHasAffiliate"].Columns.Add("AffiliateValue", typeof(String));
ds.Tables["NameHasAffiliate"].Rows.Add("1", "AffiliateValue1");



var query = 
    ds.Tables["Names"].AsEnumerable()
        .Join(
            ds.Tables["NameHasAffiliate"].AsEnumerable(), 
            n => n.Field<int>("PK"), a => a.Field<int>("fk_MainTable_PK"),
            (n, a) => new { Key = n.Field<Int32>("PK"), Name = n.Field<String>("Name")})
        .ToList();
© www.soinside.com 2019 - 2024. All rights reserved.