现在有个需求,有一张表每个月表名都会变的,但结构是一样的,我们不能再用类映射来完成的,我不能每个月都去手动添加,我们只能使用sql语句来完成这个需求。为了方便我这边选择的是SqlQueryDynamic返回dynamic类型来处理。dynamic是我们的动态类型,还是比较方便的。dynamic不能直接 as Objct,如果想那只能循环每个dynamic,然后进行属性赋值,这样太麻烦了。我们需要用json来进行过度,json相当于是我们的桥梁,dynamic——>强Class的桥梁。
环境:用的是Oracle数据库,其他是一样的。
①拼接我们的sql语句
//根据需求拼接你的表名 string tableName = $"T_YKP_POSITION{year}_{months}"; //查询返回dynamic类型,因为是Oracle数据库,返回的列都是大写 //特别注意:dynamic这里是数组 dynamic dyList = dbOracle.Db.Ado.SqlQueryDynamic($@" SELECT Id,Userid,Distance,Speed,Deviate,Gettime,Glng,Glat,Blng,Blat,Intervaltime,Itype,Createdate from {tableName} where Gettime>=TO_DATE(TO_CHAR(sysdate,'yyyy-mm-dd'), 'yyyy-mm-dd,hh24:mi:ss') order by GETTIME ");
②利用json进行转换
//先把动态类型转json字符串 string json = JsonConvert.SerializeObject(dyList); //json转强类型,TYkpPositionComm 是我们根据列创建的强类型用来接受的 List<TYkpPositionComm> result = JsonConvert.DeserializeObject<List<TYkpPositionComm>>(json);
TYkpPositionComm类:
public partial class TYkpPositionComm { public string ID { get; set; } public string USERID { get; set; } public decimal? DISTANCE { get; set; } public decimal? SPEED { get; set; } public decimal? DEVIATE { get; set; } public DateTime? GETTIME { get; set; } public decimal? GLNG { get; set; } public decimal? GLAT { get; set; } public decimal? BLNG { get; set; } public decimal? BLAT { get; set; } public decimal? INTERVALTIME { get; set; } public decimal? ITYPE { get; set; } public DateTime? CREATEDATE { get; set; } }
这样就可以了