使用LinQ将DataTable加入并返回为DataTable

时间:2018-09-28 09:09:19

标签: c# linq 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();

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

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

1 个答案:

答案 0 :(得分:0)

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

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;