Лучший способ упростить логическую проверку в C # с множеством различных возможностей - PullRequest
0 голосов
/ 02 марта 2019

Как я могу уменьшить этот код?У меня есть TransferId, WeekId и LineId, и я хочу иметь возможность запрашивать базу данных на основе, если параметры URL были заданы или нет.

Пример:

route / Query? TransferId = 5325 & lineId =10

или

route / Query? WeekdId = 11

и так далее ...

public async Task<ICollection<TransferEntity>> GetQueryAsync(string transferId, int? weekId, int? lineId)
    {
        if (Helpers.NullOrWhiteSpaceAll(transferId, weekId.ToString(), lineId.ToString()))
        {
            return null;
        }
        else if (!Helpers.NullOrWhiteSpaceAny(transferId, weekId.ToString(), lineId.ToString()))
        {
            return await _context.Transfers.Where(x => x.TransferId == transferId && x.WeekId == weekId && x.LineId == lineId).ToListAsync();
        }
        if (Helpers.NullOrWhiteSpace(transferId))
        {
            if (!Helpers.NullOrWhiteSpaceAny(weekId, lineId))
            {
                return await _context.Transfers.Where(x => x.WeekId == weekId && x.LineId == lineId).ToListAsync();
            }
            else if (!Helpers.NullOrWhiteSpace(weekId))
            {
                return await _context.Transfers.Where(x => x.WeekId == weekId).ToListAsync();
            }
            else
            {
                return await _context.Transfers.Where(x => x.LineId == lineId).ToListAsync();
            }
        }
        else if (Helpers.NullOrWhiteSpace(weekId))
        {
            if (!Helpers.NullOrWhiteSpaceAny(transferId, lineId.ToString()))
            {
                return await _context.Transfers.Where(x => x.TransferId == transferId && x.LineId == lineId).ToListAsync();
            }
            else if (!Helpers.NullOrWhiteSpace(transferId))
            {
                return await _context.Transfers.Where(x => x.TransferId == transferId).ToListAsync();
            }
            else
            {
                return await _context.Transfers.Where(x => x.LineId == lineId).ToListAsync();
            }
        }
        else
        {
            return await _context.Transfers.Where(x => x.TransferId == transferId && x.WeekId == weekId).ToListAsync();
        }
    }

Ответы [ 3 ]

0 голосов
/ 02 марта 2019

Попробуй это.Сначала создайте перечисление флагов для всех особых параметров и их возможных комбинаций:

public enum ParamSet { none = 0, transferId = 1, weekId = 2, lineId =4,
  // composite values
  transferId_weekId = 3
}

здесь первая строка - отдельные флаги параметров: если параметр не равен нулю, флаг устанавливается, в противном случае - нет.Вторая строка для допустимых комбинаций параметров.Например, идентификатор перевода и недели.Это 3, потому что 1 + 2;

Затем проанализируйте текущие значения параметров:

ParamSet currentParams = (string.IsNullOrEmpty(transferId) ? ParamSet.none : ParamSet.transferId) | (weekId == null ? ParamSet.none : ParamSet.weekId) | (lineId == null ? ParamSet.none : ParamSet.lineId);

Наконец, получите switch:

      switch(currentParams)
  {
    case ParamSet.transferId_weekId: break;
    case ParamSet.transferId: break;
    default: throw new Exception("Unsoppurted param config");
  }
0 голосов
/ 03 марта 2019

Спасибо за помощь, ребята, но это лучший способ сделать это.У меня есть TransferId, weekId, lineId. Я хочу выполнять поиск только по тем, которые не равны NULL или пробелу. Я понял, что пробел можно игнорировать, потому что вводимые данные никогда не будут пробелами

Это мое решение

public async Task<ICollection<TransferEntity>> GetQueryAsync(string transferId, int? weekId, int? lineId) =>
        await _context.Transfers.Where(x => (transferId == null || x.TransferId == transferId) && (weekId == null || x.WeekId == weekId) && (lineId == null || x.LineId == lineId)).ToListAsync();
0 голосов
/ 02 марта 2019

Linq-to-SQL объединит несколько предложений Where в один запрос - так что вы можете просто добавить их по мере необходимости и выполнить в конце:

var transfers = _context.Transfers;

if (!Helpers.NullOrWhiteSpaceAny(transferId))
{
    transfers = transfers.Where(x => x.TransferId == transferId);
}
if (weekId.HasValue)
{
    transfers = transfers.Where(x => x.WeekId == weekId);
}

return _context.Transfers == transfers? null : // did not add anything
    await  transfers.ToListAsync();
...