首页 新闻 搜索 专区 学院

求大神 说明一下ef ObjectContext 与DBContext 差别,为何我自己继承DBContext 写的类的查询Max始终把整个

0
悬赏园豆:20 [已解决问题] 解决于 2015-09-08 19:28

求大神 说明一下ef ObjectContext 与DBContext 差别,为何我自己继承DBContext 写的类的查询Max始终把整个表数据查询出来!而那种Model.edmx 不会!

如果用Model.edmx 写分页查询,生成的sql 会分页,但是用DBContext、或者DBSet 写分页 生成的sql 是自己查询整个表数据然后再 分页。。。

public class PersonRepository : GenericRepository<Person>, IPersonRepository
{
public PersonRepository(DbContext context)
: base(context)
{

}

public override IEnumerable<Person> GetAll()
{

return _entities.Set<Person>();
//return _entities.Set<Person>().Include(x => x.Country).AsEnumerable();

}

public class PersonService : EntityService<Person>, IPersonService
{
IUnitOfWork _unitOfWork;
IPersonRepository _personRepository;

public PersonService(IUnitOfWork unitOfWork, IPersonRepository personRepository)
: base(unitOfWork, personRepository)
{
_unitOfWork = unitOfWork;
_personRepository = personRepository;
}

 

 

public PagedList<Person> PageList(int pageIndex, int pageSize)
{
var list = _personRepository.GetAll().Take(50).ToList();
//var newlist= list.ToPagedList<Person>(pageIndex, pageSize);

Console.WriteLine(DateTime.Now);
var max = _personRepository.Max();
Console.WriteLine(DateTime.Now);
var newlist = (from a in list select a).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
var dd = list.Max(m => m.Id);
var totalcount = list.Count();
return new PagedList<Person>(newlist, totalcount, pageIndex, pageSize);
}
}

但是查看数据库监控

问题补充:

sparkLove的主页 sparkLove | 初学一级 | 园豆:140
提问于:2014-12-03 11:19
< >
分享
最佳答案
0

DBContext 是基于 ObjectContext ,你用哪个都不会影响Max,可能是你的表达式有问题,贴码吧

收获园豆:20
Yu | 专家六级 |园豆:12944 | 2014-12-03 11:32
其他回答(4)
0

 

没有的事,你不会用不要怪政府。

你要是用了Tolist强迫LINQ进行数据操作,那是会整个表查出来,

没有的话,LINQ会一直等待到最后,啥时候你让他开始整数据,就按照那时候的QUERY语句进行。

 

补充:

var list = _personRepository.GetAll().Take(50).ToList();

这一句我就不说啥了,不知道哪个老师教你这样写的,给差评。

那个Take(50)是你修改的时候补上去的吧,原来没有吧?

 

你都Take(50)了,后来还分个屁页啊。

你都ToList了,全部都在内存里面了,后面都是内存的操作了,跟数据库一点儿关系都没有了。

谁让你这么喜欢ToList的?

 

爱编程的大叔 | 园豆:30743 (高人七级) | 2014-12-03 11:25

其实我想说的是 var list = _personRepository.GetAll().Take(50).ToList(); 整个生成的sql语句 是 select id,Name from person ;各种百度了一下,看到一牛人博客写了,GetAll 里面调用的 _entities.Set<Person>().AsEnumerable() 就是个陷阱,会把整个表都查询出来的!之后我换成IQueryable<T> ,貌似可以进行分页了,并且其他的Max 等之类的查询,sql都生成对了

下面就是一个牛人的解释

http://developer.51cto.com/art/201309/409950_all.htm

估计我贴出来的代码,以及解释上存在不清楚吧,至于大神你说的ToList()啥啥的,这个只是一个测试,我改了几次代码没看清楚,就贴出来了,之前从

https://code.msdn.microsoft.com/Generic-Repository-Entity-b6b980f0 

这里弄下来一个别人写的例子,了解了解EF,结果测试时候,发现每次查询都把整个表数据查询出来,所以一直觉得奇怪。

支持(0) 反对(0) sparkLove | 园豆:140 (初学一级) | 2014-12-03 18:11
0

不管 ObjectContext 与DBContext,你不ToList,EF不会主动去查

Halower | 园豆:1723 (小虾三级) | 2014-12-03 11:27
0

好桑心,数据库监控都会用了,可以一步一步走,查看每部的sql语句,还不知道是哪问题。linq 要好好学学啦!

Qlin | 园豆:2403 (老鸟四级) | 2014-12-03 15:44

初次使用EF,从网上down下来的例子,linq学的还好,但是写那个查询的时候,就觉得那里错了。各种百度找答案,上面这对 爱编程的大叔  回复中已经做了解释了。感谢各位的回复!

支持(0) 反对(0) sparkLove | 园豆:140 (初学一级) | 2014-12-03 18:15
0

已经百度搞定了!

下面就是一个牛人的解释

http://developer.51cto.com/art/201309/409950_all.htm 

感谢各位的回复

sparkLove | 园豆:140 (初学一级) | 2014-12-03 18:16

完全没有注意到你上面的GetAll居然返回类型是IEnumerable<Person>,

好好的Iqueryable不用,唉。

算了,你慢慢就会明白的。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30743 (高人七级) | 2014-12-04 10:15
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册