2010-12-10 56 views
3

我找不到为什么会发生以下异常。任何帮助最受赞赏。SkipWhile失败,“LINQ to Entities does not recognized the method ...”

// 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>(); 

例外:

LINQ实体无法识别方法 “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]])' 方法,并且此方法不能转换为存储表达式。

+0

你可能需要'Where'而不是'SkipWhile'。 – Gabe 2010-12-10 19:04:20

+0

只要条件为真,我想忽略源中的元素,然后返回其余元素。 – Laura 2010-12-10 19:34:30

+0

你可能会发现[这个问题](http://stackoverflow.com/questions/9227828/how-to-implement-skipwhile-with-linq-to-sql-without-first-loading-the-whole-list)有用。它适用于LINQ to SQL,但它对于LINQ to Entities应该是一样的。 – 2012-02-13 11:56:21

回答

7

您不能在EF上使用SkipWhile,因为没有好的方法将它们转换为SQL。由于SQL查询返回无序集(除非使用ORDER BY),使用这样的谓词是没有意义的,所以它们不存在。

在EF使用SkipWhile的方法是调用它之前,只是把查询到​​的对象与AsEnumerable()

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

当然,你可能想要做这样的事情:

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

在这种情况下,Where'和'SkipWhile'具有完全不同的行为:'Where'返回'CollegeId!= 100'的所有元素,'SkipWile'只要'CollegeId!= 100'忽略源中的元素,然后在找到'CollegeId == 100'时立即返回剩余的元素。即使在上面的例子中,两个方法有相同的结果,但使用其中一个会使这种情况发生很大的变化:query = query.OrderBy(x => x.Name).Where(x = > x.CollegeID> 100);'而不是'query = query.OrderBy(x => x.Name).SkipWhile(x => x.CollegeID> 100);' – 2012-02-10 11:55:10