我用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>();
我如何可以选择所有这样的列?或者说,如果我加入了很多的表,我怎么能指定每个表中的列?
这是因为返回比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();