6
votes

Comment puis-je obtenir des valeurs d'expression LINQ

J'ai une méthode qui prend un paramètre de type d'expression, dans ma méthode, je veux obtenir des valeurs de cette expression mais que je ne peux pas trouver chaud pour le faire.

GetUser(u => u.Username == username);

GetUser(u=> u.Email == email);


0 commentaires

4 Réponses :


1
votes

Peut-être que vous devriez utiliser LINQ pour SQL. C'est exactement ce que vous voulez: déchirez l'expression et voyez quels champs et comparaisons dont vous avez besoin. Je ne suggère pas de faire cela manuellement, mais si vous le souhaitez, puis regardez les membres d'une classe d'expression, c'est un arbre d'expression et aura des nœuds comme l'accès à la propriété et la comparaison.


0 commentaires

0
votes

où code> accepte func code> prédicat, pas un expression code>. Vérifiez un exemple:

class Program
{
    private static List<int> l = new List<int> { 1, 2, 3, 4, 5 };

    static void Main(string[] args)
    {
        Console.WriteLine(GetNum(x => x > 3));
        Console.ReadKey();
    }

    private static int GetNum(Func<int, bool> predicate)
    {
        return l.Where(predicate).FirstOrDefault();
    }
}


2 commentaires

Je ne pense pas que c'est ce que l'OP recherche. Si vous lisez la fin de la question, YUCEL veut appeler différentes Sprates sur la base de laquelle le paramètre est vérifié.


accepte une expression



7
votes

L'expression peut être réduite à plusieurs expressions.

var result = GetUser(u => u.Email.Equals("abc@foo.com")); //or
var another = GetUser(u => u.Username.Contains("bar"));


1 commentaires

Pourrait également vouloir vérifier que l'opérateur est égal. Ne me souviens pas de la main comment faire ça, mais je sais que cela peut être fait (et probablement) être fait.



1
votes

Vous pouvez en théorie marcher l'arborescence d'expression dans Query.body pour déterminer l'intention de la fonction - dans ce cas, il s'agira d'un binarinexpression dans lequel vous " Je dois vérifier le gauche et droit pour voir ce qui est comparé.

Cependant, je suggérerais que si vous utilisez des SP spécifiques pour effectuer l'interrogation, l'utilisation d'une expression n'est pas vraiment la voie à suivre - créant un getuserbyusername distinct getuserbyeuil Les méthodes vont être plus robustes que si vous voulez vraiment jeter des exceptions lorsque quelqu'un appelle getUser avec une expression inattendue.


0 commentaires