我有一些方法可以对数据库执行任意 SQL 并将该数据集合序列化为具体类型的列表。然后将该数据序列化为 JSON 并存储在表格的单元格中。稍后,我需要返回并将该数据反序列化回其原始集合,以便可以使用它。
我在弄清楚如何获取Type对象并创建该类型的集合以对其进行反序列化时遇到了一些问题。这是我的代码的运行方式:
public async Task ExecuteWidget(Guid runGuid, string widgetName, Type type, string sql,
IEnumerable<SqlParameter> parameters)
{
var report = operationsContext.ReportRuns.FirstOrDefault(n => n.RunGuid == runGuid);
CheckReportStatus(report);
var param = parameters.ToList();
var result = edwContext.Database.SqlQuery(type, sql, param.ToArray<object>());
var query = result.GetQuery(param);
var data = await result.ToListAsync();
var widgetData = new ReportRunWidgetData()
{
ReportRunId = report?.ReportRunId ?? -1, // This should never be null.
WidgetName = widgetName,
WidgetData = new JavaScriptSerializer().Serialize(data),
Query = query
};
operationsContext.ReportRunWidgetDatas.Add(widgetData);
await operationsContext.SaveChangesAsync();
}
我的获取逻辑如下所示:
public object FetchWidgetData(Guid runGuid, string widgetName, Type dataType)
{
var data = operationsContext.ReportRuns
.Include("ReportRunWidgetDatas")
.FirstOrDefault(n => n.RunGuid == runGuid)?
.ReportRunWidgetDatas.FirstOrDefault(n => n.WidgetName == widgetName)?
.WidgetData;
if (data == null) return null;
var deserialized = new JavaScriptSerializer().Deserialize(data, dataType);
return deserialized;
}
现在,当ExecuteWidget调用该方法时,该type参数由小部件的 DTO 数据类型填充。例如HeadlineWidgetDTO。但是,执行命令将数据作为List<HeadlineWidgetDTO>. 当我的FetchWidgetData方法被调用时,dataType提供的仍然是HeadlineWidgetDTO,但它实际上需要是IEnumerable<HeadlineWidgetDTO>正确反序列化的类型。
仅给定单个数据行的类型,如何创建一个Type对象而不是该类型的集合?
天涯尽头无女友
相关分类