Присоединение DataTable с LinQ и возврат в DataTable - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть 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();

Дело в том, что, поскольку я пишу как a в предложении select new, он вернет все поля в dtPerson как объект DataRowвместо всех имен полей (ID, NAME, ADDRESS, PHONE).Так что каждая строка в result будет содержать 2 члена, один из которых будет DataRow, а другой - string.

Могу ли я написать способ вернуть все столбцы в dtPerson безуказав его один за другим?

1 Ответ

0 голосов
/ 28 сентября 2018

Я бы не использовал для этого подход, основанный на отражении.Все просто:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...