Ho questo pezzo di codice per il recupero e il filtraggio dei risultati dei prodotti da un database:
if (userParams.MinPrice > 0 && userParams.MaxPrice != 999999999)
{
products = products.Where(p => (p.Price >= userParams.MinPrice) &&
(p.Price <= userParams.MaxPrice));
}
Questo viene eseguito correttamente quando viene fornito solo userParams.MinPrice
ma non riesce quando viene fornito userParams.MaxPrice
.
L'errore che ottengo è questo.
Si è verificata un'eccezione non gestita durante l'esecuzione della richiesta.
System.InvalidOperationException: è stata generata un'eccezione durante il tentativo di valutare un'espressione del parametro di query LINQ. Per visualizzare ulteriori informazioni chiamare EnableSensitiveDataLogging () quando si esegue l'override di DbContext.OnConfiguring.
System.NullReferenceException: riferimento oggetto non impostato su un'istanza di un oggetto.
at lambda_method (Closure)
su Microsoft.EntityFrameworkCore.Query.ExpressionVisitors.Internal.ParameterExtractingExpressionVisitor.Evaluate (espressione espressione, stringa e parametroName).
Qualcuno conosce la soluzione a questo? Per favore aiuto
È piuttosto semplice, il tuo errore lo spiega. userParams.MaxPrice
è null. Quindi è necessario aggiungere il controllo nullo ad esso. Un modo semplice sarebbe quello di cambiare la tua query a:
if (userParams.MinPrice > 0 && userParams.MaxPrice != null && userParams.MaxPrice != 999999999)
{
products = products.Where(p => (p.Price >= userParams.MinPrice) &&
(p.Price <= userParams.MaxPrice));
}
Sebbene in base alla tua logica potresti aver bisogno di cambiare leggermente le cose. Il punto chiave è non dare per scontato che una proprietà abbia un valore, se è nullable, quindi è necessario prima convalidare che non è nullo, quindi controllarlo.
Dovresti anche aggiungere che potresti teoricamente fare userParams.MaxPrice.GetValueOrDefault() != 999999999
partendo dal presupposto che si tratta di un valore nullable int o qualcosa del genere.