2010-07-27 2 views
3

J'essaie d'utiliser une classe de construction Expression existante que j'ai créée en essayant de faire une clause select, mais je ne suis pas sûr de savoir comment attacher l'expression à l'arbre d'expression pour la sélection, j'ai essayé de faire ce qui suit:Appel d'une expression dans une instruction Select - LINQ to Entity Framework

var catalogs = matchingCatalogs.Select(c => new 
       { 
        c.CatalogID, 
        Name = EntitiesExpressionHelper.MakeTranslationExpression<Catalog>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c), 
        CategoryName = EntitiesExpressionHelper.MakeTranslationExpression<Category>("Name", ApplicationContext.Instance.CurrentLanguageID).Compile().Invoke(c.Category), 
        c.CategoryID, 
        c.StartDateUTC, 
        c.EndDateUTC 
       }); 

mais je reçois de toute évidence l'erreur indiquant que le Entity Framework ne peut pas mapper Invoke à une méthode SQL. Y a-t-il un moyen de contourner ce problème?

Pour votre information, EntitiesExpressionHelper.MakeTranslationExpression <T> (nom de chaîne, int languageID) équivaut à:

x => x.Translations.Count(t => t.LanguageID == languageID) == 0 ? x.Translations.Count() > 0 ? x.Translations.FirstOrDefault().Name : "" : x.Translations.FirstOrDefault(t => t.LanguageID == languageID).Name 

EDIT: Je me rends compte que je dois utiliser un ExpressionVisitor pour ce faire, mais je suis Je ne sais pas comment utiliser un ExpressionVisitor pour modifier l'MemberInitExpression, alors si quelqu'un sait comment accomplir cela, faites le moi savoir.

+2

Avez-vous déjà trouvé une solution à ce problème? – Rabbi

Répondre

0

Vous devez capturer les expressions dans vars. Vous ne pourrez pas utiliser des types anonymes. L'idée générale est que cela fonctionne:

Expression<Func<Foo, Bar>> exp = GenExpression(); 
var q = matchingCatalogs.Select(exp); 

Mais ce ne sera pas:

var q = matchingCatalogs.Select(GenExpression()); 

La première passe heureusement le résultat de GenExpression à L2E. La deuxième essaie de passer GenExpressionlui-même à L2E, plutôt que le résultat.

Vous avez donc besoin d'une référence à une var du même type que l'expression. Ceux-ci ne peuvent pas être typés implicitement, vous aurez donc besoin d'un type réel pour votre type de résultat.

+2

Eh bien le problème n'est pas le type anonyme, le problème est que j'ai besoin d'injecter une expression dans une autre expression, et je préfère le faire sans avoir à faire toutes les choses de MemberInitExpression – Daniel

+0

Vous pouvez penser que ma réponse n'a rien à faire avec votre problème, mais votre code ne fonctionne pas, n'est-ce pas? –

+1

Ce n'est pas ce que je dis du tout, je dis juste que c'est une solution à un problème différent. Le problème auquel je suis confronté consiste essentiellement à manipuler les arbres d'expression existants. – Daniel

Questions connexes