我经常使用SQL,并且试图将相同的联接逻辑传递给针对DataSet的LINQ查询。 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()
,但是都没有编译以提供IEnumerable版本的查询使用
DataTable boundTable = query.CopyToDataTable<DataRow>();
如何选择这样的所有列? 或者说,如果我要连接很多表,如何指定每个表中的哪些列?
答案 0 :(得分: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();