2013-03-17 2 views
1

Il s'agit d'une application Web Asp.net Mvc 4. Cela a fonctionné jusqu'à ce que j'ajoute || User.IsInRole("Admin"). Pourquoi User.IsInRole ne peut pas être dans l'expression lambda tandis que User.Identity.Name fonctionne? L'erreur est survenue à items.ToList().Erreur d'exécution: LINQ to Entities ne reconnaît pas la méthode sur "User.IsInRole()"

LINQ to Entities does not recognize the method 'Boolean IsInRole(System.String)' method, and this method cannot be translated into a store expression.

Répondre

5

Vous obtenez l'erreur car User.IsInRole() n'est pas quelque chose que vous pouvez incorporer dans une requête de base de données.

Essayez quelque chose comme ceci:

if(User.IsInRole("admin")) 
    return _db.Items; 
else 
{ 
    string name = User.Identity.Name; 
    return _db.Items.Where(d => d.CreatedBy.Equals(name))); 
} 

Je ne suis pas sûr à 100% sans test, mais LINQ to Entities peut également opposer à l'incorporation User.Identity.Name dans une expression. En récupérant sa valeur et en la passant séparément, elle sera traitée comme une constante.

Vous ne pouvez pas combiner des tests pour des éléments en mémoire (comme User.Identity) et des tests sur des champs d'entités (qui sont en réalité des colonnes de base de données) dans la même expression. Linq to Entities tentera de pousser toute l'expression vers la base de données et s'opposera si elle ne le peut pas.

+0

'User.Identity.Name' fonctionne. Il a eu l'erreur après avoir ajouté User.IsInRole ("Admin"). – ca9163d9

+0

C'est bon à savoir. La règle est peut-être "Vous ne pouvez pas combiner des fonctions définies dans .NET avec des tests sur des colonnes de base de données". –

2

Cette méthode n'est pas valide pour linq. Vous devez vous rappeler que toutes les méthodes passées à link doivent être traduites en une expression SQL. Vous ne pouvez pas appeler une fonction depuis .net ou votre assembly à l'intérieur de linq

2

Je ferais votre requête séparément pour admin. Entity Framework tente de le convertir en une expression SQL qu'il ne peut pas faire pour cela.

Questions connexes