我有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
中的所有列而不用一一指定吗?
答案 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;