无法访问映射变量 (C#)

Cannot access variable on mapping (C#)

我在后端有一个方法,它获取与 table 的外键相关的值。

这些外键可以为空,但其中一个键始终有值。

这是方法

   public async Task<ListResultDto<QuoteListDto>> GeQuotesTabData(int? landlordId, int? agentId,
        int? propertyTenantId)
    {

        if (landlordId.HasValue)
        {
            var query = _quoteRepository.GetAll()
                .Where(x => x.LandlordId == landlordId);

        }

        if (agentId.HasValue)
        {
            var query = _quoteRepository.GetAll()
                .Where(x => x.AgentId == agentId);
        }

        if (propertyTenantId.HasValue)
        {
            var query = _quoteRepository.GetAll()
                .Where(x => x.PropertyTenantId == propertyTenantId);
        }

        return new ListResultDto<QuoteListDto>(await query.ProjectTo<QuoteListDto>(ObjectMapper)
            .OrderBy(x => x.Id).ToListAsync());
    }

在这一行,我得到一个错误Cannot resolve symbol query

 return new ListResultDto<QuoteListDto>(await query.ProjectTo<QuoteListDto>(ObjectMapper)
            .OrderBy(x => x.Id).ToListAsync());

我需要如何重写我的方法?

你的问题是可变范围。当你定义一个变量时,它只在你定义它的范围内可见。

您在局部范围内定义了三个不同的 query 变量。 None 其中的内容在您尝试使用它的地方是可以访问的。

使用前需要先定义,像这样:

public async Task<ListResultDto<QuoteListDto>> GeQuotesTabData(int? landlordId, int? agentId,
    int? propertyTenantId)
{
    IQueryable<Quote> query = null;

    if (landlordId.HasValue)
    {
        query = _quoteRepository.GetAll().Where(x => x.LandlordId == landlordId);
    }

    if (agentId.HasValue)
    {
        query = _quoteRepository.GetAll().Where(x => x.AgentId == agentId);
    }

    if (propertyTenantId.HasValue)
    {
        query = _quoteRepository.GetAll().Where(x => x.PropertyTenantId == propertyTenantId);
    }

    return new ListResultDto<QuoteListDto>(await query.ProjectTo<QuoteListDto>(ObjectMapper)
        .OrderBy(x => x.Id).ToListAsync());
}

当然,您的所有查询都应该属于同一类型。否则,您将不得不在本地范围内定义和执行它们。

当您尝试使用它时,您可能还应该添加一些对查询为空的情况的错误处理。

声明并初始化您的变量。另外我会 re-write 你这样的方法:

public async Task<ListResultDto<QuoteListDto>> GeQuotesTabData(int? landlordId, int? agentId,
    int? propertyTenantId)
{
    var query = _quoteRepository.GetAll();

    if (landlordId.HasValue)
    {
        query  = query.Where(x => x.LandlordId == landlordId);
    }

    if (agentId.HasValue)
    {
        query = query.Where(x => x.AgentId == agentId);
    }

    if (propertyTenantId.HasValue)
    {
        query = query .Where(x => x.PropertyTenantId == propertyTenantId);
    }

    return new ListResultDto<QuoteListDto>(await query.ProjectTo<QuoteListDto>(ObjectMapper)
        .OrderBy(x => x.Id).ToListAsync());
}

也取自 this 答案,您可以创建一个 WhereIf 扩展来清理 if 语句。

public static IQueryable<TSource> WhereIf<TSource>(
    this IQueryable<TSource> source,
    bool condition,
    Expression<Func<TSource, bool>> predicate)
{
    if (condition)
        return source.Where(predicate);
    else
        return source;
}

让你的代码看起来像这样:

public async Task<ListResultDto<QuoteListDto>> GeQuotesTabData(int? landlordId, int? agentId,
    int? propertyTenantId)
{
    var list = await  _quoteRepository.GetAll()
        .WhereIf(landlordId.HasValue, x => x.LandlordId == landlordId)
        .WhereIf(agentId.HasValue, x => x.AgentId == agentId)
        .WhereIf(propertyTenantId.HasValue, x => x.PropertyTenantId == propertyTenantId)
        .ProjectTo<QuoteListDto>(ObjectMapper)
        .OrderBy(x => x.Id)
        .ToListAsync();

    return new ListResultDto<QuoteListDto>(list);
}