Session变量转换报错:无法将OrderedEnumerable转为List<ReportDetails>如何解决
问题根因
- 你存入
Session["Grps"]的对象本身就不是List<ReportDetails>类型,是LINQ排序后生成的OrderedEnumerable延迟执行对象,它只实现了IEnumerable<ReportDetails>接口,没有继承List类型,直接强制转List必然抛出类型转换异常。 - 你之前的两次尝试都存在语法错误:类型转换的括号配对错误,且强制转换的作用范围不对,没有先把Session取出的对象转成对应的可枚举接口类型。
解决方法
临时修复取数逻辑
直接将取出的对象先转成通用的可枚举接口,再调用ToList转成列表即可,可兼容空值的写法如下:
data = (Session["Grps"] as IEnumerable<ReportDetails>)?.ToList() ?? new List<ReportDetails>();
如果需要显式判空可以按下面的方式写:
if (Session["Grps"] != null) { data = (Session["Grps"] as IEnumerable<ReportDetails>).ToList(); } else { // 为空时初始化空列表避免后续逻辑触发空引用异常 data = new List<ReportDetails>(); }
根本优化方案
建议在存入Session的时候就把LINQ查询的延迟执行对象转换为实列表,避免后续取数时反复处理类型问题,存数时写法示例:
// 排序查询完成后直接调用ToList执行查询,再存入Session var grps = 你的数据查询逻辑.OrderBy(x => x.排序字段).ToList(); Session["Grps"] = grps;后续取数就可以直接强转List类型:
data = Session["Grps"] as List<ReportDetails> ?? new List<ReportDetails>();
内容的提问来源于stack exchange,提问作者user721126
相关产品推荐
相关产品推荐

