91 votes

La méthode ne peut pas être traduite dans une expression de magasin

J'ai vu ce code de travail avec LINQ to SQL, mais lorsque j'utilise Entity Framework, il met cette erreur:

LINQ to entities ne reconnaît pas la méthode " du Système.Linq.IQueryable'1[MyProject.Modèles.CommunityFeatures] GetCommunityFeatures ()', et cette méthode ne peut pas être traduit dans un magasin d'expression".

Le référentiel de code est ceci:

public IQueryable<Models.Estate> GetEstates()
{
    return from e in entity.Estates
           let AllCommFeat = GetCommunityFeatures()
           let AllHomeFeat = GetHomeFeatures()
           select new Models.Estate
                      {
                                EstateId = e.EstateId,
                                AllHomeFeatures = new LazyList<HomeFeatures>(AllHomeFeat),
                                AllCommunityFeatures = new LazyList<CommunityFeatures>(AllCommFeat)
                      };
}

public IQueryable<Models.CommunityFeatures> GetCommunityFeatures()
{
    return from f in entity.CommunityFeatures
           select new CommunityFeatures
                      {
                          Name = f.CommunityFeature1,
                          CommunityFeatureId = f.CommunityFeatureId
                      };
}

public IQueryable<Models.HomeFeatures> GetHomeFeatures()
{
    return from f in entity.HomeFeatures
           select new HomeFeatures()
           {
               Name = f.HomeFeature1,
               HomeFeatureId = f.HomeFeatureId
           };
}

LazyList est une Liste qui s'étend le pouvoir de IQueryable.

Quelqu'un pourrait-il expliquer pourquoi cette erreur se produit?

120voto

Morteza Manavi Points 20486

Raison: De par sa conception, LINQ to entities exige de l'ensemble de la requête LINQ expression à traduire à un serveur de requête. À seulement quelques pas corrélées sous-expressions (les expressions de la requête qui ne dépendent pas de résultats à partir du serveur) sont évalués sur le client avant que la requête est traduite. Méthode arbitraire des invocations qui n'ont pas connu de traduction, comme GetHomeFeatures() dans ce cas, ne sont pas pris en charge.
Pour être plus précis, LINQ to entities seulement un soutien sans paramètre constructeurs et les Initialiseurs.

Solution: Par conséquent, pour obtenir plus de cette exception, vous avez besoin de fusionner votre sous-requête dans la le principal pour GetCommunityFeatures() et GetHomeFeatures() au lieu de le faire directement appel de méthodes à partir de l'intérieur de la requête LINQ. Aussi, il y a un problème sur les lignes que vous avez essaye d'instancier une nouvelle instance de LazyList à l'aide de ses constructeurs paramétrés, tout comme vous le faites dans LINQ to SQL. Pour que la solution serait de passer à évaluation de la clientèle de requêtes LINQ (LINQ to Objects). Cela va vous obliger à invoquer la AsEnumerable méthode pour votre LINQ to entities requêtes avant d'appeler le LazyList constructeur.

Quelque chose comme ceci devrait fonctionner:

public IQueryable GetEstates() {
    return from e in entity.Estates.AsEnumerable()
           let AllCommFeat = from f in entity.CommunityFeatures
                             select new CommunityFeatures {
                                 Name = f.CommunityFeature1,
                                 CommunityFeatureId = f.CommunityFeatureId
                             },
           let AllHomeFeat = from f in entity.HomeFeatures
                             select new HomeFeatures() {
                                 Name = f.HomeFeature1,
                                 HomeFeatureId = f.HomeFeatureId
                             },
           select new Models.Estate {
                EstateId = e.EstateId,
                AllHomeFeatures = new LazyList(AllHomeFeat),
                AllCommunityFeatures = new LazyList(AllCommFeat)
           };
}


Plus d'Infos: Veuillez jeter un oeil à LINQ to entities, ce qui n'est pas pris en charge? pour plus d'info. Consultez également LINQ to entities, les Solutions sur ce qui n'est pas pris en charge pour une discussion détaillée sur les solutions possibles.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X