旧的问题还没解决,新的问题又来了,EF6 DBFirst

小小小的程序员 2017-09-13 06:05:18

public List<T> GetListByPage<T,Tkey>(int pageSize, int pageIndex,out int totalPage, out int total, Expression<Func<T, bool>> whereLambda, Func<T, Tkey> orderbyLambda, bool isAsc) where T : class
{
using (var context = new Entities())
{
context.Database.CommandTimeout = 100;
total = context.Set<T>().Where(whereLambda).Count();
totalPage = (total + pageSize - 1) / pageSize;
if (isAsc)
{
var temp = context.Set<T>().Where(whereLambda)
.OrderBy<T, Tkey>(orderbyLambda)
.Skip(pageSize * (pageIndex - 1))
.Take(pageSize);
return temp.ToList();
}
else
{
var temp = context.Set<T>().Where(whereLambda)
.OrderByDescending<T, Tkey>(orderbyLambda)
.Skip(pageSize * (pageIndex - 1))
.Take(pageSize);

List<T> list = temp.ToList();
return list;
}
}
}

这是一个分页的通用的方法
bll.GetListByPage<t_hotelinfo,long>(10,3,out pages,out count,p=>p.CityId==101,p=>p.ID,false);

这是调用
不知道为什么,生成的SQL语句,只有一个where条件,order by没有 limit没有(mysql数据库),表里有50W数据,只有一个where条件,查出来是1W多数据,查询时间是80多秒,但return list里确实只有10条数据,应该是假分页了,把1W多数据查出来放内存,然后在skip和take。但EF不应该是这样工作的吧????
这个方法生成的SQL不应该是有where 有order by 有limit吗??????
求高人解答
...全文
335 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 hanjun0612 的回复:
[quote=引用 6 楼 fanjian1314 的回复:] 对了,我前两天发的一个帖子也是关于EF的,调用存储过程的,用映射不行,用sqlquery去call也不行,都在输出参数上报错,是不是EF对有output参数的存储过程不支持呀
sqlquery调用sql存储过程是没问题的,关键是对于mysql可能支持的不好。 不过我也没怎么使用过 mysql+ef[/quote] 可以研究一下,我试过映射,也试过sqlquery,对output参数都不能支持
正怒月神 版主 2017-09-14
  • 打赏
  • 举报
回复
引用 6 楼 fanjian1314 的回复:
对了,我前两天发的一个帖子也是关于EF的,调用存储过程的,用映射不行,用sqlquery去call也不行,都在输出参数上报错,是不是EF对有output参数的存储过程不支持呀
sqlquery调用sql存储过程是没问题的,关键是对于mysql可能支持的不好。 不过我也没怎么使用过 mysql+ef
正怒月神 版主 2017-09-14
  • 打赏
  • 举报
回复
目测是 order的问题。 因为where是个express, 所以到where为止,前面生成的都是 IQueryable<>,他不会加载全部数据到缓存里。 而通过你前面调试的sql语句,看出来是变成了IEnumerable<>,先将数据缓存到了本地。 因此,在看一下 order是 fun<>,就是这里的问题了。 只是我比较好奇, 当 order 是 fun<>时, context.Set<T>().Where(whereLambda) .OrderBy<T, Tkey>(orderbyLambda) 这个语句不需要强制转换吗?
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
当你需要查询,就写什么查询。根本用不着再来抽象什么 Expression 啦!直接写查询而根本用不着定义什么 GetListByPage 方法。
对了,我前两天发的一个帖子也是关于EF的,调用存储过程的,用映射不行,用sqlquery去call也不行,都在输出参数上报错,是不是EF对有output参数的存储过程不支持呀
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
当你需要查询,就写什么查询。根本用不着再来抽象什么 Expression 啦!直接写查询而根本用不着定义什么 GetListByPage 方法。
我试了把Expression 去掉,但是会报内存溢出的错误,然后我查了一下Expression 这个类,问题果然还是出在这里,我把orderby那个表达式也变成Expression 的,问题就解决了,生成的SQL有where 有orderby 有limit。多谢帮忙,初次探索EF,很多不懂。
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
当你需要查询,就写什么查询。根本用不着再来抽象什么 Expression 啦!直接写查询而根本用不着定义什么 GetListByPage 方法。
好的,我试一下
丰云 2017-09-14
  • 打赏
  • 举报
回复
用法问题,别怪ef了。。。。 我用ef这么多年了,也没出什么问题。。。 特别不明白有些程序,就是喜欢反射,觉得这样可以减少代码。。。。 难道就没有一个有见识的人告诉你们,你们这样写的代码,效率非常低吗? 难道就没有一个有见识的人告诉你们,你们这样写的代码,非常难以维护吗?
  • 打赏
  • 举报
回复
当你需要查询,就写什么查询。根本用不着再来抽象什么 Expression 啦!直接写查询而根本用不着定义什么 GetListByPage 方法。
  • 打赏
  • 举报
回复
Expression 坑了你。 写具体一些。例如
var query = ......;
if( cond1)
    query = from x in query order by x.a select x;
else 
    query = from x in query order by x.b+1 select x;
  • 打赏
  • 举报
回复

这是生成的SQL,这真的很郁闷,skip和take没有生成对应的limit

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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