使用LINQ,如何获得以IEnumerable <datarow>

时间:2019-02-04 06:26:04

标签: c# linq

我经常使用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>();

如何选择这样的所有列? 或者说,如果我要连接很多表,如何指定每个表中的哪些列?

1 个答案:

答案 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();