【问题标题】:Joining DataTable with LinQ and return as DataTable将 DataTable 与 LinQ 连接并作为 DataTable 返回
【发布时间】:2018-09-28 09:09:18
【问题描述】:

我有 2 个独立的数据源。一个来自数据库查询,将作为 DataTable 返回,另一个来自其他地方并作为字典返回。

我想将这 2 个数据源连接在一起,并将其合并为 1 个 DataTable。所以这里是代码:

string query = @"select ID, NAME, ADDRESS, PHONE from PERSON a";

OracleCommand dbCommand = (OracleCommand)this.Database.GetSqlStringCommand(query) as OracleCommand;
DataTable dtPerson = this.Database.ExecuteDataSet(dbCommand).Tables[0];

Dictionary<string, DTMember> member = GetMember();

// Join the 2 results
var result = (from a in dtPerson.AsEnumerable()
    join b in member on a.Field<string>("ID") equals b.Key into b1
    from b in b1.DefaultIfEmpty()
    select new
    {
        a,
        MEMBER_TYPE = b.Value == null ? string.Empty : b.Value.MemberType
    });

return result.ToDataTable();

问题是,由于我在select new 子句中写为a,它将返回dtPerson 中的所有字段作为DataRow 对象而不是所有字段名称(ID、NAME、ADDRESS , 电话)。这样result 中的每一行将包含 2 个成员,一个是 DataRow,另一个是 string

我可以写一种方式来返回dtPerson中的所有列而不一一指定吗?

【问题讨论】:

  • 简答:否(没有反射和辅助方法)

标签: c# linq datatable


【解决方案1】:

我不会为此使用基于反射的方法。很简单:

var query = 
    from a in dtPerson.AsEnumerable()
    join b in member on a.Field<string>("ID") equals b.Key into b1
    from b in b1.DefaultIfEmpty()
    select new
    {
        PersonRow  = a,
        MemberType = b.Value?.MemberType ?? String.Empty
    };

DataTable resultTable = dtPerson.Clone(); // empty same columns
resultTable.Columns.Add("MemberType");    // add this column

foreach (var x in query)
{
    object[] allFields = x.PersonRow.ItemArray.Concat(new []{x.MemberType}).ToArray();
    resultTable.Rows.Add(allFields);
}

return resultTable;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2019-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多