2010-12-10 46 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