0
votes

LINQ - Sélectionnez par nom de propriété

J'ai la classe suivante: xxx

échantillon: xxx

Comment puis-je interroger les utilisateurs "actifs" par le nom de la propriété? C'est ce que j'ai essayé, mais je reçois:

"L'expression LINQ ... n'a pas pu être traduite. Soit réécrire la requête sous une forme pouvant être traduite, ou passer au client Évaluation explicitement en insérant un appel à (), asenumerable (), asasyncénumérable (), tolis () ou toltasync () " xxx


4 commentaires

Vous ne connaissez pas le nom de la propriété à la compilation? Pourquoi donc? Quoi qu'il en soit, l'évaluation du client devrait fonctionner comme le message suggère (par exemple, usercontext.user.tolist (). Où (...) ).


Premier actif n'est pas une propriété ... c'est un champ. getProperty ne le trouvera pas. Deuxièmement ... Pourquoi la réflexion est-elle requise lorsque u et t sont le même type.


@LEGACYCODE - Eh bien, c'est une propriété auto.


@Minkrafter Ce n'était pas quand je me suis répondu. Janzen l'a changé à la propriété auto.


4 Réponses :


0
votes

Comme l'erreur indique que vous devez appeler asen-tumérable () avant d'essayer de filtrer les données de la clause WHERE.

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

int totalActive = userContext.Users.AsEnumerable().Where(u => Convert.ToBoolean(p.GetValue(u)) == true).Count();


1 commentaires

Je serais très hésitant à utiliser cela contre une base de données, surtout si la table utilisateurs avait un grand nombre de lignes.



1
votes

Si, pour une raison quelconque, vous devez exécuter cela de manière dynamique, vous devrez construire arborescence d'expression (cocher QUESTIONABLE.Où code> Signature) manuellement:

public class User
{
    public string userName {get;set;}
    public bool active {get;set;}
}

Type t = typeof(User);
PropertyInfo p = t.GetProperty("active");

var prmtr = Expression.Parameter(t);
var value = Expression.Constant(true);
var comprasion = Expression.Equal(Expression.Property(prmtr, p), value);
var expr = Expression.Lambda<Func<User, bool>>(comprasion, prmtr);

int totalActive = userContext.Users.Where(expr).Count();


0 commentaires

0
votes
int totalActive = userContext.Users.Where(u => u.active).Count();

0 commentaires