将IEnumerable转换为Organization类对象及代码修改问题求助
解决获取目标组织及其子组织的类型转换与后续属性访问问题
我来帮你梳理下遇到的两个问题,以及对应的解决办法:
第一个问题:IEnumerable到Organization的类型转换错误
你最初修改代码时,把返回单个实例的SingleOrDefault换成了返回集合的Where,但还是把结果赋值给了Organization类型的变量——这肯定会报错,因为Where返回的是一组组织,不是单个组织。
解决办法很简单,把变量类型改成集合类型,同时建议把变量名改成复数(语义更清晰):
// 注意变量名改成organizations(复数),类型是IEnumerable<Organization> IEnumerable<Organization> organizations = workshop.Organizations .Where(o => o.Id == assignedOrganizationId || o.ParentId == assignedOrganizationId);
如果后续需要列表的操作(比如添加、移除元素),也可以改成List<Organization>:
List<Organization> organizations = workshop.Organizations .Where(o => o.Id == assignedOrganizationId || o.ParentId == assignedOrganizationId) .ToList();
第二个问题:集合无法访问单个实例的属性
你改成集合后,代码organization.AutoAssignedWorkshops报错,是因为现在organizations是一个组织集合,不是单个Organization对象,自然不能直接访问单个实例的AutoAssignedWorkshops属性。
根据你的需求(判断是否有组织的AutoAssignedWorkshops包含当前workshop),需要用嵌套的Any来遍历集合中的每个组织:
// 判断集合中任意一个组织的AutoAssignedWorkshops包含指定workshop bool currentAutoAssignSetting = organizations .Any(org => org.AutoAssignedWorkshops.Any(w => w.Id == workshop.Id));
如果你的需求是所有组织都要包含这个workshop,就把外层的Any换成All:
bool allOrgsHaveAutoAssign = organizations .All(org => org.AutoAssignedWorkshops.Any(w => w.Id == workshop.Id));
额外补充:如果需要递归获取所有层级的子组织
当前的Where条件只能获取目标组织和直接子组织,如果你的业务需要获取所有层级的子组织(比如子组织的子组织,以此类推),可以写一个递归方法来实现:
IEnumerable<Organization> GetAllRelatedOrganizations(int targetOrgId) { // 先获取当前组织 var currentOrg = workshop.Organizations.SingleOrDefault(o => o.Id == targetOrgId); if (currentOrg == null) yield break; // 返回当前组织 yield return currentOrg; // 递归获取所有直接子组织,再子组织的子组织... foreach (var childOrg in workshop.Organizations.Where(o => o.ParentId == targetOrgId)) { foreach (var nestedOrg in GetAllRelatedOrganizations(childOrg.Id)) { yield return nestedOrg; } } } // 使用这个方法获取所有相关组织 var organizations = GetAllRelatedOrganizations(assignedOrganizationId);
内容的提问来源于stack exchange,提问作者Joshua Boyd
相关产品推荐
相关产品推荐

