我有以下查询
string query = string.Format("select * from `{0}` inner join `{1}` on `{0}`.Id = `{1}`.RecordId where recordid= {2}", tableName, GetAuditTableName(tableName), context.RecordId);
我按照以下方式执行此查询:
MySqlCommand cmd = new MySqlCommand(query, conn);
conn.Open();
DataTable dtRecords = new DataTable();
using (MySqlDataReader reader = cmd.ExecuteReader())
{
dtRecords.Load(reader);
}
conn.Close();
List<AuditLog> records = new List<AuditLog>();
foreach (DataRow row in dtRecords.Rows)
{
records.Add(new AuditLog
{
CreatedOn = row["CreatedOn"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn"].ToString()) : DateTime.MinValue,
});
}
所以我在这里使用DataRow
逐个获取记录。但我的问题是两个表中都有两个相同的列,即CreatedOn
。在这里,我想从CreatedOn
表中选择Join
列值,并从第一个表中选择其他列值。如何选择此值?
答案 0 :(得分:1)
更改查询并使用连接表中列的别名。像:
select table1.*, table2.CreatedOn as CreatedOn2 from `{0}` as table1 inner join `{1}` as table2 on table1.Id = table2.RecordId where table2.recordid= {2}
然后选择CreatedOn2
字段
CreatedOn = row["CreatedOn2"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn2"].ToString()) : DateTime.MinValue
谢谢。
答案 1 :(得分:0)
首先,以这种方式创建sql命令文本的方法容易出现问题,最糟糕的是Sql Injection攻击,但是说并查看实际代码,引用第二列的最简单方法是遵循ADO这些案例的.NET约定。
如果SELECT查询创建的表中有两个或多个具有相同名称的列,则会更改冲突列的名称,并将渐进编号附加到名称。因此,您的第二个CreatedOn列变为CreateOn1。在构建AuditLog实例时,可以参考此列。
records.Add(new AuditLog
{
CreatedOn = row["CreatedOn1"] != DBNull.Value ? Convert.ToDateTime(row["CreatedOn1"].ToString()) : DateTime.MinValue,
});
不过,我认为你需要一种不同的方法。允许您从查询中更好地控制要返回的内容的一个。当您只需要一列时,从基础表返回所有行是一种非常糟糕的做法。可能会将所需列的列表添加到您的格式字符串中。 (这也允许将您选择的ALIAS附加到第二列CreateOn)