Possibilité d'ignorer l'expression si elle est nulle ou vide sans vérifier la valeur null dans une instruction IF ?
-
21-12-2019 - |
Question
Eh bien, j'ai deux expressions X , Y
si flag est vrai alors y a une expression
j'ai besoin d'un List<mylist> v = list.where(x).where(y).ToList();
Dans ce cas, si l'expression y est nulle, elle lèvera une exception,
Je sais que je peux vérifier null avant de créer la requête, mais dans une requête énorme, cela peut être un cauchemar.
Existe-t-il donc un moyen ou une valeur pour indiquer que l'expression doit être ignorée lors de l'exécution de l'expression ?
La solution
Vous pouvez ajouter vos propres méthodes d’extension assez facilement.Il n'est pas immédiatement clair si vous utilisez IQueryable<>
ou IEnumerable<>
(votre code ne serait pas compilé de toute façon, en raison de problèmes de casse et du fait qu'aucun Where
la méthode renvoie List<T>
, et le fait que vous utilisez x
dans la même déclaration que vous le déclarez), mais vous pouvez gérer les deux facilement :
public static class NullSafeExtensions
{
public static IEnumerable<T> NullSafeWhere<T>(this IEnumerable<T> source,
Func<T, bool> predicate)
{
return predicate == null ? source : source.Where(predicate);
}
public static IQueryable<T> NullSafeWhere<T>(this IQueryable<T> source,
Expression<Func<T, bool>> predicate)
{
return predicate == null ? source : source.Where(predicate);
}
}
Alors:
var results = source.NullSafeWhere(x).NullSafeWhere(y);
(Bien sûr, ce n'est nul qu'en termes de prédicat, pas de source...)
Autres conseils
Vous pouvez utiliser l'opérateur coalesce pour fournir une autre expression lorsque y est défini sur null :
list.Where(y ?? (() => true))
Dans votre cas, appeler la méthode avec Expression<Func<BAL.vw_BudgetRecord, bool>>
Le type de retour doit toujours renvoyer une expression de ce type.
En supposant votre exemple, vous souhaiterez peut-être revenir bool?
(bool nullable) au cas où l'utilisation n'est pas dans le rôle SuperAdmin.
Si j'ai raison, vous devriez changer le type de retour de votre méthode en Expression<Func<BAL.vw_BudgetRecord, bool?>>
.
Sinon, vous modifiez simplement le type de retour en Expression
;cela vous permettra de retourner les deux LambdaExpression
et DefaultExpression
comme en même temps.