J'ai un formulaire avec plusieurs champs (nom de l'entreprise, code postal, etc.) qui permet à un utilisateur de rechercher des entreprises dans une base de données. Si l'utilisateur entre des valeurs dans plus d'un champ, je dois effectuer une recherche sur tous ces champs. J'utilise LINQ pour interroger la base de données. Jusqu'à présent, j'ai réussi à écrire une fonction qui va regarder leur entrée et la transformer en une liste d'expressions. Je veux maintenant transformer cette liste en une seule expression que je peux ensuite exécuter via le fournisseur LINQ.Comment combiner des expressions LINQ en une?
Ma première tentative a été comme suit
private Expression<Func<Company, bool>> Combine(IList<Expression<Func<Company, bool>>> expressions)
{
if (expressions.Count == 0)
{
return null;
}
if (expressions.Count == 1)
{
return expressions[0];
}
Expression<Func<Company, bool>> combined = expressions[0];
expressions.Skip(1).ToList().ForEach(expr => combined = Expression.And(combined, expr));
return combined;
}
Cependant cela échoue avec un message d'exception le long des lignes de « L'opérateur binaire ne définit pas pour ... ». Est-ce que quelqu'un a des idées sur ce que je dois faire pour combiner ces expressions?
EDIT: J'ai corrigé la ligne où j'avais oublié d'assigner le résultat de et d'associer les expressions à une variable. Merci d'avoir signalé cela.
@Jon Skeet: 'combined' sera tapé comme' Expression'; vous devez faire un peu de travail pour le renvoyer en tant que 'Expression>'. –
jason
Je suis d'accord que votre premier code est plus facile à comprendre, donc je vais faire de cette bonne réponse. Cependant, je vais utiliser le second extrait car c'est exactement ce dont j'ai besoin - je rendais les choses beaucoup trop complexes, merci Jon. – gilles27
Ironiquement, j'étais en train d'éditer pendant que ces deux commentaires étaient écrits - mais comme c'était ce deuxième extrait qui a été utilisé, je pense que je vais le laisser tel quel :) –