2010-07-09 10 views
0

I ont cette méthode:Expression et paramètre

public static Expression<Func<MyEntity, bool>> MyMethod(string someId) 
    { 
     return o => o.SomeProperty.Equals(someId); 
    } 

Ceci est passé à une autre méthode qui utilise le cadre de l'entité avec cette expression pour récupérer les éléments correspondants. Mon problème est que ça ne marche pas. Si je remplace le someId dans le cadre de l'appel Equals avec une valeur réelle cela fonctionne. Cependant, cela ne fonctionne pas si je transmets la même valeur dans cette méthode ci-dessus. Cela signifie-t-il que le paramètre someId n'est pas évalué tant que l'expression n'est pas réellement utilisée et ne contient donc pas la valeur réelle? Désolé, je suis un peu confus ici.

Merci

Mise à jour:

Certaines informations de débogage pour celui qui fonctionne où le PARAM est codé en dur

.Lambda #Lambda1<System.Func`2[MyEntity,System.Boolean]>(MyEntity $t) {\r\n .Call ($t.SomeProperty).Equals(\"test1\") 

Certaines informations de débogage pour celui qui ne fonctionne pas où la valeur est passée dans la méthode

.Lambda #Lambda1<System.Func`2[MyEntity,System.Boolean]>(MyEntity $t) {\r\n .Call ($t.SomeProperty).Equals(.Constant<MyEntity+<>c__DisplayClass4>(MyEntity+<>c__DisplayClass4).someId) 

Je suppose que lorsque la valeur n'est pas codée en dur, l'expression a une référence à quelque chose qui n'existe pas? Désolé, je m'embrouille avec ce qui se passe ici!

Mise à jour 2:

C'est là où il est utilisé - une méthode dans une classe référentiel:

public MyEntity Get(string someId) 
{ 
    var queryPredicate = MyEntity.MyMethod(someId); 
    var foundEntity = this.Query(queryPredicate); 
} 

Query est une méthode sur la classe de base du référentiel comme ci-dessous:

public IEnumerable<TEntity> Query(Expression<Func<TEntity, bool>> predicate) 
{ 
    if (predicate == null) 
    { 
     throw new ArgumentNullException("predicate"); 
    } 
    using (var context = new TContext()) 
    { 
     return context.CreateObjectSet<TEntity>().AsExpandable().Where(predicate).ToList(); 
    } 
} 
+0

Pouvez-vous montre le code où vous essayez d'utiliser ce résultat? –

Répondre

1

Cela ressemble à un problème où LinqKit peut être la solution que vous cherchez:

http://www.albahari.com/nutshell/linqkit.aspx

Jetez un coup d'oeil et voir si elle résout :) il

+0

C'est ce que j'utilise, d'où le "AsExpandable" dans l'exemple ci-dessus. Merci pour la suggestion cependant. D'autres idées que je fais mal? –

+0

Argh! J'ai trouvé le problème et il est dû à la chaîne dans la base de données contenant des espaces après les caractères donc "Equals" ne fonctionnait pas. Argh! Argh! Argh! Merci pour votre aide de toute façon :-) –

0

Etes-vous sûr que la valeur donnée n'est pas nulle? Pouvez-vous donner l'exception qu'il lance? Peut-être que c'est un "int" que vous devez passer comme ID?

+0

Il n'y a pas d'exception, cela ne correspond à rien lors de l'utilisation de l'expression. –

+0

Etes-vous sûr que votre code utilise cette expression? Mettez un point d'arrêt sur la ligne de retour et lorsque vous y êtes, essayez d'utiliser Quickwatch pour trouver la bonne façon de l'utiliser en remplaçant ce que vous utilisez comme valeur. –

+0

100% sûr qu'il utilise les deux fois. –

0

Je n'ai pas compilé hnady pour tester cela, mais à partir du code IL, il semble être créer une fermeture pour someId. Fondamentalement, il crée une fonction/expression qui sera compilée & exécutée plus tard, et la compilation suppose que vous aurez besoin de la valeur de someId au moment de son exécution, plutôt qu'au moment où l'expression a été créée. Je pense que si vous passez à travers une température, cela devrait fonctionner.

public static Expression<Func<MyEntity, bool>> MyMethod(string someId) 
{ 
    string tempSomeId = someId; 
    return o => o.SomeProperty.Equals(tempSomeId); 
} 
+0

Merci, c'est un peu ce que je pensais. Cependant, ce qui précède ne fonctionne toujours pas malheureusement. –