2010-12-10 53 views
3

Je ne trouve pas pourquoi l'exception suivante se produit. Toute aide est très appréciée.SkipWhile échoue avec "LINQ to Entities ne reconnaît pas la méthode ..."

// EdcsEntities is derived from System.Data.Objects.ObjectContext 
EdcsEntities db = new EdcsEntities(); 

var query = from i in db.Colleges 
      select i; 

query = query.SkipWhile<College>(x => x.CollegeID != 100); 

List<College> l = query.ToList<College>(); 

Exception:

LINQ aux entités ne reconnaît pas la méthode « System.Linq.IQueryable 1[EDCS.ServiceLayer.DataAccess.College] SkipWhile[College](System.Linq.IQueryable 1 [EDCS.ServiceLayer.DataAccess.College], System.Linq.Expressions.Expression 1[System.Func 2 [EDCS.ServiceLayer.DataAccess.College, System.Boolean]]) 'méthode , et cette méthode ne peut pas être traduite dans une expression de magasin.

+0

Vous probablement vouloir 'Where' au lieu de' SkipWhile'. – Gabe

+0

Je veux ignorer les éléments de la source tant que la condition est vraie, puis renvoie les éléments restants. – Laura

+0

Vous pouvez trouver [cette question] (http://stackoverflow.com/questions/9227828/how-to-implement-skipwhile-with-linq-to-sql-without-first-loading-the-whole-list) utile . C'est pour LINQ to SQL, mais cela devrait fonctionner de la même manière pour LINQ to Entities. –

Répondre

7

Vous ne pouvez pas utiliser SkipWhile avec EF car il n'y a pas de bonne façon de les traduire en SQL. Puisque les requêtes SQL renvoient des ensembles non ordonnés (à moins que vous n'utilisiez ORDER BY), cela n'a pas de sens d'utiliser des prédicats comme ça, donc ils n'existent pas.

La façon d'utiliser SkipWhile dans EF est de transformer simplement la requête en objets avec AsEnumerable() avant de l'appeler:

query = query.AsEnumerable().SkipWhile(x => x.CollegeID != 100); 

Bien sûr, vous voudrez probablement faire quelque chose comme ceci:

query = query.OrderBy(x => x.CollegeId).Where(x => x.CollegeID > 100); 
+1

Dans ce cas 'Where' et' SkipWhile' ont un comportement totalement différent: 'Where' retourne tous les éléments avec' CollegeId! = 100', 'SkipWile' ignore les éléments dans la source tant que' CollegeId! = 100' et renvoie ensuite les éléments restants dès que 'CollegeId == 100' est trouvé. Même si dans l'exemple ci-dessus les deux méthodes ont le même résultat, utiliser l'une ou l'autre ferait une grande différence dans un cas comme celui-ci: 'query = query.OrderBy (x => x.Name) .Where (x = > x.CollegeID> 100); 'par opposition à' query = query.OrderBy (x => x.Name) .SkipWhile (x => x.CollegeID> 100); ' –