Невозможно получить доступ к переменной при отображении (C #) - PullRequest
0 голосов
/ 08 июля 2019

У меня есть метод на заднем конце, который получает значения, связанные с внешним ключом таблицы.

Эти внешние ключи могут иметь значение NULL, но один из этих ключей всегда будет иметь значение.

Вот метод

   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());

Как мне переписать мой метод?

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

Объявите и инициализируйте вашу переменную. Кроме того, я бы переписал вам метод так:

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());
}

Также взято из этого ответа, вы можете создать расширение 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);
}
1 голос
/ 08 июля 2019

Ваша проблема в переменной области.Когда вы определяете переменную, она видна только в области, в которой вы ее определяете.

В локальной области вы определяете три разные переменные query.Ни один из них не доступен там, где вы пытаетесь его использовать.

Вам необходимо определить его перед использованием, примерно так:

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());
}

Конечно, все ваши запросы должны относиться ктого же типа.В противном случае вам придется определить и выполнить их в локальных областях.

Вероятно, вам следует также добавить некоторую обработку ошибок в случае, когда запрос имеет значение null, когда вы пытаетесь его использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...