J'ai la classe suivante: échantillon: p> 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: p> "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 () " em> p>
4 Réponses :
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();
Je serais très hésitant à utiliser cela contre une base de données, surtout si la table utilisateurs i> avait un grand nombre de lignes.
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();
int totalActive = userContext.Users.Where(u => u.active).Count();
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ù (...) code>).
Premier
actif code> n'est pas une propriété ... c'est un champ.
getProperty code> ne le trouvera pas. Deuxièmement ... Pourquoi la réflexion est-elle requise lorsque
u code> et
t code> 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.