2017-10-03 9 views
0

On dirait que EF ne peut traduire l'express dans le code suivant, voici l'appelEF ne pouvait pas traduire l'expression sql

Counter lastCounter = unitOfWork.CounterRepository.FindLast(x => x.Div == counter.Div, x => x.Div); 

c'est la méthode

public Counter FindLast(Expression<Func<Counter, bool>> predicate, params Expression<Func<Counter, object>>[] includedProperties) 
    { 
     IQueryable<Counter> set = context.Set<Counter>().Where(predicate); 

     foreach (var includeProperty in includedProperties) 
     { 
      set = set.Include(includeProperty); 
     } 
     return set.Last(); 
    } 

Toute idée quel pourrait être le problème?

+0

Y at-il retourne exception ou résultat vide? –

Répondre

0

Il est tout à fait simple, vraiment: Entity Framework juste ne supporte pas Last(). La raison est que dans SQL, vous pouvez pas sélectionner le dernier élément (à savoir que vous avez SELECT TOP mais ne pas SELECT BOTTOM).

Voir https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/ef/language-reference/supported-and-unsupported-linq-methods-linq-to-entities

+0

oui, mais ils peuvent trier en descendant puis sélectionnez Haut, non? – Sisyphus

+1

Je suppose qu'ils pourraient faire cela, mais ensuite vient la question: trier décroissant par quoi? Je suppose qu'ils pourraient faire un tri basé sur le PK, mais je suppose qu'il y a d'autres questions de conception que cette solution poserait. Mais si vous le souhaitez, vous pouvez le faire vous-même explicitement dans votre requête. –