Je suis en train de créer Linq Expression que je peux utiliser pour interroger entité enfant pour les propriétés de parents (entité PATIENT dans ce cas), en utilisant cette méthode:LINQ-TO-sql expression pour l'entité mère
private IQueryable<LAB_ORDER> SelectFilter(string fieldName, string value)
{
var param = Expression.Parameter(typeof(PATIENT), "item");
var field = Expression.PropertyOrField(param, fieldName);
var search = Expression.Constant(value, typeof(string));
var body = Expression.Call(field, "Contains", null, search);
Expression<Func<LAB_ORDER, bool>> lambda;
if (String.IsNullOrEmpty(value))
{
lambda = x => true;
}
else
{
lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm);
}
var linqFilter = from e in context.LAB_ORDERS select e;
return linqFilter.Where(lambda);
}
Looks comme il construit une expression correcte, mais exception que je reçois est la suivante:
System.ArgumentException: ParameterExpression de type 'patient' ne peut pas être utilisé pour le paramètre délégué de type LAB_ORDER.
Alors que je peux faire linqFilter.Where (x => x.PATIENT.LAST_NAME == « Smith ») sans aucun problème, ne peut pas utiliser l'expression ci-dessus, ce qui devrait se traduire par quelque chose de semblable à cela. Comment est-ce que je corrigerais l'expression ci-dessus pour la corriger? Je charge avec impatience l'entité parent avec un enfant, donc ce n'est pas un problème.
EDIT
De Anders réponse, il semble que je dois modifier l'expression lambda à:
lambda = Expression.Lambda<Func<PATIENT, bool>>(body, parm);
Maintenant, lorsque je tente de l'utiliser, linqFilter.Where (lambda) me donne erreur de compilation "Pas de surcharge convenable" ce que je comprends pourquoi - linqFilter est "IQueryable<LAB_ORDER>", not "IQueryable<PATIENT>",
alors comment faire? Juste pour résumer les choses, la seule question reste - comment créer une expression pour les propriétés parentes?
Merci pour la réponse Anders. C'est exactement exact - j'essaie d'exprimer x => x.PATIENT. [FieldName] .Contains(). Mais si j'essaie var param = Expression.Parameter (typeof (LAB_ORDER), "item"); alors je reçois une exception sur une ligne suivante: var field = Expression.PropertyOrField (param, "PATIENT.LAST_NAME"); - "PATIENT.LAST_NAME n'est pas membre de LAB_ORDER Pouvez-vous montrer comment j'ai besoin de modifier l'expression lambda? Merci – Victor
Aussi, si je change mon lambda en lambda = Expression.Lambda> (corps, parm); puis linqFilter.Where (lambda) me donne une erreur de compilation - pas de surcharge appropriée –
Victor
Vous ne pouvez pas utiliser Expression.PropertyOrField (param, "PATIENT.LAST_NAME"); Vous devez construire une expression imbriquée le pation de la LAB_ORDER et ensuite le LAST_NAME du patient –