J'obtiens l'erreur suivante en essayant de faire une requête linq:
LINQ to Entities ne reconnaît pas la méthode 'Boolean IsCharityMatching (System.String, System.String)', et cette méthode ne peut pas être traduite en une expression de magasin.
J'ai lu beaucoup de questions précédentes où les gens obtiennent la même erreur, et si je comprends bien, c'est parce que LINQ to Entities nécessite que toute l'expression de requête linq soit traduite en requête serveur, et par conséquent, vous ne pouvez pas appeler une méthode externe dedans. Je n'ai pas encore réussi à convertir mon scénario en quelque chose qui fonctionne, et mon cerveau commence à fondre, alors j'espérais que quelqu'un pourrait me diriger dans la bonne direction. Nous utilisons Entity Framework et le modèle de spécification (et je suis nouveau dans les deux).
Voici le code qui utilise la spécification:
ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);
charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();
Voici l'expression linq:
public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
return p => p.IsCharityMatching(this.charityName, this.charityReference);
}
Voici la méthode IsCharityMatching:
public bool IsCharityMatching(string name, string referenceNumber)
{
bool exists = true;
if (!String.IsNullOrEmpty(name))
{
if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
!this.alias.ToLower().Contains(name.ToLower()) &&
!this.charityId.ToLower().Contains(name.ToLower()))
{
exists = false;
}
}
if (!String.IsNullOrEmpty(referenceNumber))
{
if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
{
exists = false;
}
}
return exists;
}
Faites-moi savoir si vous avez besoin de plus d'informations.
Merci beaucoup,
Annelie
Find()
comment l'utiliser à l'IsSatisfied()
intérieur.Réponses:
Comme vous l'avez compris, Entity Framework ne peut pas réellement exécuter votre code C # dans le cadre de sa requête. Il doit être capable de convertir la requête en une instruction SQL réelle. Pour que cela fonctionne, vous devrez restructurer votre expression de requête en une expression que Entity Framework peut gérer.
la source
Expression<Func<T,type>>
est une très belle approche à ce sujet.context.Where(IsSatisfied())
J'ai eu la même erreur dans ce code:
c'était exactement l'erreur:
J'ai résolu de cette façon:
J'ai ajouté un .ToList () avant ma table, cela dissocie l'entité et le code linq, et évite que ma prochaine expression linq soit traduite
REMARQUE: cette solution n'est pas optimale, car évitez le filtrage d'entités et charge simplement toutes les tables en mémoire
la source
Si quelqu'un cherche une réponse VB.Net (comme je l'étais au départ), la voici:
la source
J'ai eu un problème similaire au vôtre et cette documentation LINQ m'a aidé à trouver les bonnes fonctions de chaîne pour contourner les limitations.
la source