SkipWhile失败,"LINQ to Entities无法识别方法......"

Lau*_*ura 4 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>();
Run Code Online (Sandbox Code Playgroud)

例外:

LINQ to Entities无法识别方法'System.Linq.IQueryable 1[EDCS.ServiceLayer.DataAccess.College] SkipWhile[College](System.Linq.IQueryable1 [EDCS.ServiceLayer.DataAccess.College],System.Linq.Expressions.Expression 1[System.Func2 [EDCS.ServiceLayer.DataAccess.College,System.Boolean]])'方法,并且此方法无法转换为商店表达式.

Gab*_*abe 8

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

SkipWhile在EF中使用的方法是AsEnumerable()在调用之前将查询转换为对象:

query = query.AsEnumerable().SkipWhile(x => x.CollegeID != 100);
Run Code Online (Sandbox Code Playgroud)

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

query = query.OrderBy(x => x.CollegeId).Where(x => x.CollegeID > 100);
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,`Where` 和 `SkipWhile` 具有完全不同的行为:`Where` 返回所有包含 `CollegeId != 100` 的元素,`SkipWile` 忽略源中只要 `CollegeId != 100` 的元素,然后一旦找到 `CollegeId == 100` 就返回剩余元素。即使在上面的示例中,两种方法具有相同的结果,在这种情况下使用其中一种或另一种方法也会产生很大的差异:`query = query.OrderBy(x =&gt; x.Name).Where(x = &gt; x.CollegeID &gt; 100);` 与 `query = query.OrderBy(x =&gt; x.Name).SkipWhile(x =&gt; x.CollegeID &gt; 100);` 相反 (2认同)