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

泛用人形代码复制机 2014-03-26 11:41:51
 
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()
哪种效率高?

...全文
1510 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
devmiao 2014-03-26
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/7253529/last-and-lastordefault-not-supported OrderByDescending() 后用 FirstOrDefault()
  • 打赏
  • 举报
回复
引用 1 楼 q107770540 的回复:
it is funny as linq to ef support first/firstOrDefault, but no support Last/LastOrDefault :( also TakeWhile not supported by linq2ef http://social.msdn.microsoft.com/Forums/vstudio/en-US/2ccc7935-c6f5-4bf2-a4cd-0a6de9e38ed8/firstordefault-and-lastordefault?forum=wpf so I suggested this:

 var result =  manager.GetAll().AsEnumerable()
                    .OrderByDescending(a => a.PointRequired)
                    .TakeWhile(a => a.PointRequired < 1300).FirstOrDefault();
2. nomatter index exists or not , I recommed to this code: manager.GetAll().OrderBy(a => a.PointRequired).ToList()
AsEnumerable和ToList是一个意思,都是实际在数据库中执行了sql吗? 那就没有解决我的问题啊,还是造成了多余的网络io. 而且{20,15,10,5}.TakeWhile(a => a< 13) 得不到结果吧! 用where还差不多 我改成了
 var result =
                manager.GetAll()
                    .OrderByDescending(a => a.PointRequired)
                    .Where(a => a.PointRequired < 1300).FirstOrDefault();
貌似可以了.
q107770540 2014-03-26
  • 打赏
  • 举报
回复
it is funny as linq to ef support first/firstOrDefault, but no support Last/LastOrDefault :(
also TakeWhile not supported by linq2ef
http://social.msdn.microsoft.com/Forums/vstudio/en-US/2ccc7935-c6f5-4bf2-a4cd-0a6de9e38ed8/firstordefault-and-lastordefault?forum=wpf
so I suggested this:

var result = manager.GetAll().AsEnumerable()
.OrderByDescending(a => a.PointRequired)
.TakeWhile(a => a.PointRequired < 1300).FirstOrDefault();


2. nomatter index exists or not , I recommed to this code:
manager.GetAll().OrderBy(a => a.PointRequired).ToList()

8,497

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧