Possibilité d'ignorer l'expression si elle est nulle ou vide sans vérifier la valeur null dans une instruction IF ?

StackOverflow https://stackoverflow.com//questions/20016318

  •  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 ?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top