O código:
var primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Prime").FirstOrDefault();
if (primeCtr == null)
primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Original Prime").FirstOrDefault();
Explicação: Se existir um contratante do tipo "Prime", use-o, caso contrário, use o "Original Prime"
Eu poderia ter codificado isso usando ? : expressão, mas acho que teria sido menos eficiente?
var primeCtr = con.Contractors?.Where(ctr => ctr.Type == "Prime").Any() ? con.Contractors?.Where(ctr => ctr.Type == "Prime").FirstOrDefault() : con.Contractors?.Where(ctr => ctr.Type == "Original Prime").FirstOrDefault();
A consulta para "Prime" seria executada duas vezes, eu acho?
Apenas tentando determinar se existe uma maneira mais elegante de expressar isso usando o EF Core 8? Este é meu primeiro aplicativo EF Core e não uso o EF antigo há vários anos, então pode estar enferrujado.
A maneira mais comum de fazer isso é ordenar por preferência e escolher o primeiro:
Se houver mais tipos você terá que filtrar "Prime" e "Original Prime" (adicione um
Where
antes de fazer o pedido).A ordem é decrescente porque então aquele em que
ctr.Type == "Prime"
é verdadeiro flutua para o topo.Você pode usar o operador ternário dentro de
Where
/OrderBy
:Isso se traduz em um CASE em SQL: (Não se importe com os nomes das tabelas/colunas, este foi apenas um teste rápido usando uma tabela/entidade anterior)
Você pode adicionar quantos valores forem necessários e fornecer controle total sobre a ordem sem assumir uma ordem crescente ou decrescente no valor do Tipo.
Indiscutivelmente não existe uma maneira "agradável" de expressar isso em SQL, mas existem opções se você quiser salvar viagens de ida e volta, você pode fazer algo como o seguinte:
A ordem é a chave aqui - resultará em
Prime
estar no topo, caso haja algum.Para incluir mais tipos você pode usar o operador ternário: