2010-12-10 18 views
3

次の例外が発生する理由が見つかりません。どんな助けでも大歓迎です。SkipWhileが "LINQ to Entitiesでメソッドを認識できません"というエラーが発生しました...

// 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

あなたはおそらく 'SkipWhile'の代わりに' Where'が必要でしょう。 – Gabe

+0

条件が真である限り、ソースの要素を無視して残りの要素を返します。 – Laura

+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でも同じように動作するはずです。 –

答えて

7

SkipWhileをEFに使用することはできません。なぜなら、それらを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);' –

関連する問題