Estou tentando buscar os registros do banco de dados onde qualquer parâmetro pode ser nulo ou vazio, é isso que tenho, mas não me dá o resultado correto. Dos cinco parâmetros, qualquer um pode ser nulo, mas um deve ter valor.
public async Task<IEnumerable<SomeTable>> GetByCondition(string param1, string param2, string param3, string param4, int param5)
{
var data = await _dataContext.SomeTable.Where(a => a.param1 == (string.IsNullOrEmpty(param1) ? "" : param1)
&& a.param2 == (string.IsNullOrEmpty(param2) ? "" : param2)
&& a.param3 == (string.IsNullOrEmpty(param3) ? "" : param3)
&& a.param4 == (string.IsNullOrEmpty(param4) ? "" : param4)
&& a.param5 == (param5 == 0 ? 0 : param5)).ToListAsync();
return data;
}
Expandindo o link fornecido nos comentários, a abordagem que você está usando resultará na condicionalidade dos parâmetros que precisam ser traduzidos em SQL. Pode funcionar, mas é bastante complicado de escrever. Seu cenário provavelmente não está funcionando porque os parâmetros de registro podem ser #null, mas sua consulta resultante compararia linhas sem um requisito de parâmetro com uma string vazia. O que você provavelmente precisaria seria mais parecido com:
... e isso ainda pode não ter o comportamento desejado dependendo de como você realmente deseja lidar com parâmetros #null e/ou valores de coluna #null.
No entanto, como mencionado, isso resultará na gravação de quaisquer condições de verificação nula no SQL e no cálculo para cada parâmetro em cada consulta. Uma solução melhor ao lidar com cenários simples que são combinados com AND é mover a condicionalidade para o código e anexar apenas condições de filtro se uma condição estiver presente:
Isso resulta em uma consulta SQL que incluirá apenas condições em parâmetros que possuem valores para filtrar. O uso de
AsQueryable()
inicialmente só é necessário para converter a variável de consulta resultanteIQueryable<SomeTable>
em vez deDbSet<SomeTable>
. Alternativamente, você pode simplesmente começar usando a conversão explícita:Where
... ou se você tiver uma cláusula não condicional , oAsQueryable()
não é necessário, ou seja:Para cenários mais complexos onde você pode querer coisas como condições OR, eu recomendaria usar uma solução de construtor de predicado dinâmico que pode construir uma
Where
expressão de cláusula condicionalmente com a lógica desejada. Não é necessário onde as condições são combinadas com AND, pois este é o comportamento padrão quando o EF encontra múltiplasWhere
cláusulas.