linq 从链接类返回属性名

7uzetpgm  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(160)

在我的应用程序中,我有以下类:

public class Area : ModelBase
{
    public Guid AreaTypeId{ get; set; }
    public AreaType AreaType { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }        
}

public class AreaType : ModelBase
{
    public string Name { get; set; }
    public Guid ProjectId { get; set; }
    public Project Project { get; set; }

    public ICollection<Area> Areas { get; set; }
}

Area类有一个dto,如下所示:

public class AreaDto: DtoBase
{
    public Guid AreaTypeId { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
}

我有一个规范文件,用于根据提供的数据获取数据:

public class AreaSpecification : Specification<Area>
{
    public AreaSpecification(AreaFilter filter)
    {
        if (filter.ProjectId != Guid.Empty) {
            Query
                .Where(a => a.AreaType.ProjectId == filter.ProjectId);
        }

        if (filter.AreaTypeId != Guid.Empty)
        {
            Query
                .Where(a => a.AreaTypeId == filter.AreaTypeId)
                .Include(a => a.AreaType);
        }
    }
}

这是使用Ardalis. specification。
我想要的是,当提供AreaTypeId时,它将返回使用该Id的Area以及AreaType属性。我想我可以通过使用以下命令来获取它们:
.Include(a => a.AreaType)
但是,无论该行是否存在,返回的数据都是相同的,AreaType不显示。我错过了什么,我如何才能让它显示?
如果我将第二个if语句更新为:

if (filter.AreaTypeId != Guid.Empty)
        {
            Query
                .Where(a => a.AreaType.Id == filter.AreaTypeId);
        }

它仍然工作,所以AreaType数据在那里,只是没有显示

wlsrxk51

wlsrxk511#

发现了我的错误在我的AreaDto文件中,我没有添加用于显示AreaType名称的属性。所以当我更新我的dto时,就像这样:

public class AreaDto: DtoBase
{
    public Guid AreaTypeId { get; set; }
    public string Code { get; set; }
    public string Description { get; set; }
    public string AreaTypeName { get; set; }
}

然后做了我的查询:

if (filter.AreaTypeId != Guid.Empty)
        {
            Query
                .Where(a => a.AreaType.Id == filter.AreaTypeId)
                .Include(a => a.AreaType);
        }

它显示了我要查找的数据

pgky5nke

pgky5nke2#

要在结果中包含AreaType属性,可以修改AreaSpecification以使用Include方法沿着ThenInclude方法:

public class AreaSpecification : Specification<Area>
{
    public AreaSpecification(AreaFilter filter)
    {
        if (filter.ProjectId != Guid.Empty)
        {
            Query = Query
                .Include(a => a.AreaType)
                .ThenInclude(at => at.Project)
                .Where(a => a.AreaType.ProjectId == filter.ProjectId);
        }

        if (filter.AreaTypeId != Guid.Empty)
        {
            Query = Query
                .Include(a => a.AreaType)
                .Where(a => a.AreaTypeId == filter.AreaTypeId);
        }
    }
}

相关问题