2010-03-03 8 views
1

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?

Répondre

2

Dans l'instruction suivante, vous dites que vous allez construire une fonction qui prend un argument LAB_ORDER et retourne un booléen.

lambda = Expression.Lambda<Func<LAB_ORDER, bool>>(body, parm); 

Cependant la variable parm contient un PATIENT. Vous devrez réécrire l'expression lambda pour prendre un LAB_ORDER à la place. Si je comprends bien vos intentions, vous correctement l'expression que vous essayez d'exprimer est

x => x.PATIENT.[fieldnName].Contains() 

mais l'expression que vous avez construit est

x => x.[fieldName].Contains() 
+0

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

+0

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

+0

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 –