You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:18:03