C#如何获取存储EF6查询结果的ArrayList中匿名对象的属性值
问题原因
你通过LINQ Join生成的是匿名类型对象,又将这些对象存入了非泛型的ArrayList中(ArrayList所有元素默认是object类型),编译阶段无法识别匿名类型的属性结构,因此不能直接获取Dept、Name等属性值。
最优解决方案(推荐)
放弃ArrayList和匿名类型,改用强类型DTO传输数据,可获得完整的编译时类型检查,避免运行时报错。
步骤1:定义匹配属性的DTO类
public class DocumentOwnerDto { public string NIK { get; set; } public string Name { get; set; } public string Dept { get; set; } public string EmailTo { get; set; } public string EmailCC { get; set; } public string EmailBCC { get; set; } public bool ActiveEmp { get; set; } }
步骤2:修改数据查询方法,返回强类型集合
替换原有的ArrayList返回类型为泛型List<DocumentOwnerDto>,LINQ投影时直接实例化DTO类而非匿名类型:
public List<DocumentOwnerDto> getList(string strSortOrder, string strSeacrhStringName, string strSearchDept) { try { using (Entities ent = new Entities()) { if (!string.IsNullOrEmpty(strSortOrder)) { var listObjName = ent.DocumentOwner.Join( ent.Employee.Where(o => o.Active == true).OrderBy(o => o.NAME), docown => docown.EMP_ID, EAL => EAL.EMP_ID, (docown, EAL) => new DocumentOwnerDto { NIK = docown.EMP_ID, Name = EAL.NAME, Dept = EAL.Organiz_Stru, EmailTo = docown.EmailAddressTo, EmailCC = docown.EmailAddressCC, EmailBCC = docown.EmailAddressBCC, ActiveEmp = EAL.Active }).ToList(); return listObjName; } return new List<DocumentOwnerDto>(); } } catch (Exception ex) { throw ex; } }
步骤3:调用端直接读取强类型属性
private List<Documents> getDocOwn(string sortOrder, string searchStringName, string searchStringDept) { try { DocumentOwnerMapper objDocOwnMapper = new DocumentOwnerMapper(); List<DocumentOwnerDto> listDocOwn = objDocOwnMapper.getList(sortOrder, searchStringName, searchStringDept); var listDocOwnModel = new List<M_DC_DocumentOwnerModel>(); foreach (var obj in listDocOwn) { // 直接访问属性即可 string dept = obj.Dept; string name = obj.Name; // 后续按业务需求赋值给M_DC_DocumentOwnerModel对象即可 } return new List<Document>(); } catch (Exception ex) { return new List<Document>(); } }
临时兼容方案(不推荐长期使用)
如果暂时无法修改返回类型,可使用dynamic动态类型跳过编译检查,直接读取属性:
foreach (dynamic obj in listDocOwn) { string dept = obj.Dept; string name = obj.Name; }
注意:该方案没有编译时校验,属性名拼写错误、类型不匹配等问题只会在运行时抛出异常,仅适合临时调试使用。
内容的提问来源于stack exchange,提问作者farid wahyu
相关产品推荐
相关产品推荐

