Tengo lo siguiente:

¿Cómo puedo incluir un filtro en mi declaración where solo si no es nulo? intenté lo siguiente pero siempre obtengo 0 registros

public async Task<IList<UserRefDto>> GetUserRef(Dictionary<string, string> filter) {
var iod = 549; // a test user who has 2548 records in db
var favorites = filter.ContainsKey("fav") ? filter["fav"].ConvertToGuid(",") : null;
var histories = filter.ContainsKey("his") ? filter["his"].ConvertToGuid(",") : null;
var orders = filter.ContainsKey("ord") ? filter["ord"].ConvertToGuid(",") : null;
var result = await context.UserRefernces
               .Where(x =>
                      x.User_iod = iod 
                   && (favorites != null && favorites.Contains((Guid)x.FavId))
                   && (histories != null && histories.Contains((Guid)x.HistoryId))
                   && (orders != null && orders.Contains((Guid)x.OrderId))
                   )
               .AsNoTracking()
               .ToListAsync()
               .ConfigureAwait(false);

            return result;
}

EDITAR Nota: Si todas las claves tienen valores, entonces recibo los registros, solo si uno o más son nulos, no recibo nada de db

1
Maro 5 ene. 2020 a las 02:55

2 respuestas

La mejor respuesta

Puede crear su consulta con varias declaraciones .Where(), que se agregarán a través de una condición AND. Pero agregue las declaraciones adicionales .Where() solo cuando los valores estén presentes.

var query = context.UserRefernces
                   .Where(x => x.User_iod == iod);
if (favorites != null) {
    query = query.Where(x => favorites.Contains((Guid)x.FavId));
}
// same for "histories" and "orders"

var result = await query
           .AsNoTracking()
           .ToListAsync()
           .ConfigureAwait(false);
4
Progman 5 ene. 2020 a las 07:37

Reemplace favorites != null && con favorites == null || en su consulta de la siguiente manera:

var result = await context.UserRefernces
               .Where(x => x.User_iod = iod 
                   && (favorites == null || favorites.Contains((Guid)x.FavId))
                   && (histories == null || histories.Contains((Guid)x.HistoryId))
                   && (orders == null || orders.Contains((Guid)x.OrderId)))
               .AsNoTracking()
               .ToListAsync()
               .ConfigureAwait(false);

            return result;

Ahora la consulta funcionará como se esperaba.

1
TanvirArjel 5 ene. 2020 a las 05:32