这句简单linq语句,在ef里面没法执行.

泛用人形代码复制机 泛用人形代码复制机 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
 
var manager = CreateManager<IUserLevelManager>();
var result =
manager.GetAll()
.OrderBy(a => a.PointRequired)
.TakeWhile(a => a.PointRequired < 1300).LastOrDefault();


需求大家应该可以猜到,有500,1000,1500,2000若干等级,取得1300所在的1000等级
GetAll返回的是 IQueryable<T> 所以TakeWhile也是在数据库里面执行的,然后就会报错,

LINQ to Entities 不识别方法“XXX.Entities.EF6.UserLevel LastOrDefault[UserLevel](System.Linq.IQueryable`1[XXX.Entities.EF6.UserLevel])”,因此该方法无法转换为存储表达式。

现在我是 manager.GetAll().ToList(),先全部取出来,然后在内存中使用linq to object语句可以得到结果,但是感觉这样不太好,造成了多余的网络io,而且ef框架设计的时候应该需要考虑这种情况的吧,
最近才接触ef,对这一块还不是很熟,请大神指教.

@caozhy @q107770540


顺便还有个问题,在数据库PointRequired字段(int)有索引的情况下
manager.GetAll().ToList() .OrderBy(a => a.PointRequired)
和 manager.GetAll() .OrderBy(a => a.PointRequired).ToList()
哪种效率高?

...全文
评论 3
收藏 已收藏
分享
返回顶部