C#中如何转换Session中存储的字典?含代码转换失败场景
在C#中转换Session存储的字典的正确方法
看起来你在把Session中存储的权限数据转换成IDictionary<string, string>时遇到了转换失败的问题——这很常见,因为你当前存到Session里的是实体对象的列表,而不是已经转换好的字典,直接强转肯定会抛出类型不匹配的异常。让我结合你的代码逻辑一步步帮你解决:
先明确你的核心问题
你存入Session的代码是:
HttpContext.Current.Session.Add("_ProjectRights", ProjectRepository.GetProjectRechten(user1.UserId).ToList());
这里存储的是List<ProjectRechten>(假设你的实体类名为ProjectRechten),而你查询数据库时生成字典的逻辑是基于User.ProjectUser关联的权限数据。两者的类型完全不同,直接强转自然会失败。
解决方案1:取出Session中的实体列表,再转换为字典
如果你需要保持原有的Session存储逻辑(存实体列表),那么取出后需要按照你查询数据库的逻辑重新生成字典:
步骤1:安全取出Session中的数据
先做类型转换和空值检查,避免空引用或类型转换异常:
// 从Session取出数据,并转换为对应的实体列表类型 var projectRightsList = HttpContext.Current.Session["_ProjectRights"] as List<ProjectRechten>; // 如果Session数据不存在或过期,重新获取并存入Session if (projectRightsList == null) { var userId = user1.UserId; // 替换为你的用户ID变量 projectRightsList = ProjectRepository.GetProjectRechten(userId).ToList(); HttpContext.Current.Session["_ProjectRights"] = projectRightsList; }
步骤2:将实体列表转换为目标字典
按照你查询数据库时的逻辑,把实体列表转换成IDictionary<string, string>:
// 匹配你查询代码的转换逻辑,生成字典 IDictionary<string, string> privilegeLevel = projectRightsList // 按primaryKey1分组(对应你查询中的se.primaryKey1) .GroupBy(pr => pr.primaryKey1.ToString()) .ToDictionary( group => group.Key, // 拼接该分组下所有ProjectRight的primaryKey2 group => string.Join(",", group.SelectMany(pr => pr.ProjectRight).Select(sel => sel.primaryKey2)) );
解决方案2:直接存入字典到Session(更高效)
如果你的权限数据不会频繁变化,建议在存入Session时就直接转换为字典,这样后续取出时可以直接使用,无需重复转换:
存入Session时的代码
var userId = user1.UserId; // 先生成字典(复用你原有的查询逻辑) var data = Db.Users.SingleOrDefault(s => s.UserPk == userId)?.ProjectUser .Select(se => new { Key = se.primaryKey1.ToString(), Items = string.Join(",", se.ProjectRight.Select(sel => sel.primaryKey2).ToList()) }); // 生成字典,空值时返回空字典避免异常 IDictionary<string, string> projectRightsDict = data?.ToDictionary(pair => pair.Key, pair => pair.Items) ?? new Dictionary<string, string>(); // 将字典存入Session HttpContext.Current.Session.Add("_ProjectRights", projectRightsDict);
取出Session时的代码
// 直接强转字典类型,同时做空值检查 var privilegeLevel = HttpContext.Current.Session["_ProjectRights"] as IDictionary<string, string>; if (privilegeLevel == null) { // 处理Session过期或数据不存在的情况,比如重新获取数据 }
常见错误原因总结
- 直接强转类型不匹配:Session中存的是
List<T>,却试图转成IDictionary<string, string>,必然抛出InvalidCastException - Session数据为空/过期:Session默认有过期时间,取出时必须做空值检查
- 实体属性不匹配:确保
ProjectRechten实体包含primaryKey1和ProjectRight集合属性,否则转换逻辑会报错
内容的提问来源于stack exchange,提问作者Kai
相关产品推荐
相关产品推荐

