“L'expression LINQ nœud de type "Invoquer" n'est pas pris en charge dans LINQ to entities” - perplexe!
Dans mon EF plus tard, je suis en train de passer dans une fonction anonyme pour être utilisé dans le cadre de ma requête Linq. La fonction serait de passer dans un INT et retourner un BOOLÉEN (u.RelationTypeId est un INT). Ci-dessous est une version simplifiée de ma fonction:
public IEnumerable<UserBandRelation> GetBandRelationsByUser(Func<int, bool> relation)
{
using (var ctx = new OpenGroovesEntities())
{
Expression<Func<UsersBand, bool>> predicate = (u) => relation(u.RelationTypeId);
var relations = ctx.UsersBands.Where(predicate);
//mapping, other stuff, back to business layer
return relations.ToList();
}
}
Cependant, je reçois le message d'erreur indiqué ci-dessus. Il me semble que je vais tout corriger par la construction d'un prédicat à partir de la fonction. Des idées? Merci.
Vous devez vous connecter pour publier un commentaire.
Vous essayez de passer un arbitraire .NET en fonction... comment pourrait-entity framework espoir pour traduire cela en SQL? Vous pouvez le changer pour prendre un
Expression<Func<int, bool>>
au lieu de cela, et de construire laWhere
clause de cela, bien que ce ne sera pas particulièrement facile, car vous aurez besoin de la réécrire avec un paramètre différent de l'expression (c'est à dire le remplacement quel que soit le paramètre expression est dans l'expression d'origine de l'arbre avec l'expression de l'appelu.RelationTypeId
).Pour être honnête, pour le bien de préciser uniquement
u.RelationTypeId
dans l'expression lambda que vous utilisez pour créer l'arborescence d'expression pour passer dans la méthode, vous seriez mieux d'utiliser simplement:Expression.Invoke
pour but de permettre aux EF de travailler avec des sous-expressions (quelque chose L2S prend en charge out-of-the-box). Il ne peut toujours pas travailler avec les délégués, bien sûr, En disant tout simplement qu'un graveur est quelque part par là...Expression<Func<Hotel, decimal>> getProperty = h => h.NumberOfDiamonds;
et puisquery = query.Where(h => getProperty(h) == 0)
mais je reçois l'erreurgetProperty is a variable but is used like a method
. Est-ce possible?J'ai été faire cette erreur et je suis en utilisant Entity Framework avec PredicateBuilder par Joe Albahari de construire dynamique
where
clauses. Si vous arrive d'être dans le même état, vous devriez appeler leAsExpandable
méthode:Si l'interrogation avec Entity Framework, modifier la dernière ligne de ce:
Cette méthode fait partie de LINQKIT DLL que vous pouvez saisir ici ou par l'intermédiaire d'un package NuGet ici.
Tout fonctionne bien maintenant. 🙂
AsExpandable()
provoque aucun impact sur les performances? Je suis à l'aide d'un générique de référentiel et de n'utiliser le prédicat générateur d'occasion, est-il utile de créer un référentiel de méthode pour le prédicat de la construction?AsExpandable()
de passer dans le prédicatWhere()
. Peut-être parce que la nouvellePredicateBuilder.New<T>()
point de départ?Vous pouvez appeler Expand() methode sur votre prédicat avant la où demande
Je sais que cette réponse est vraiment en retard, mais j'ai rencontré le même problème et cela m'a conduit ici, alors j'ai pensé que je devais partager ma solution.
J'ai lu Leniel de répondre, et il m'a donné une idée. La valeur par défaut des types de la méthode "AsEnumerable()" qui se comporte de la même manière, l'atténuation de la question.
AsEnumerable()
sera la cause de laWhere()
fonction invoquée par Linq to Objects et pas Linq to entities.