最近在使用 Linq To Entity 时,在自己程序BUG中对的分页的一些小理解。
先来看看 什么是 Linq To Entity:
从字面意思来看是通过Linq 来检索数据模型,那么什么又是数据模型呢?
数据模型的概念很宽泛,在Linq to Entity 中,我们可以把它理解为数据结构的印射,直白点说,就是他的模型结构和你在数据库中指定表的结构相一致。
相应的Linq to Entity 用白话来讲术的话,就是我们在查询数据模型,由于模型结构和你在数据库中指定表的结构相一致,所以在最底层的查询中,其实
还是在对数据库表进行操作,Linq to entity 更多的是体现面向对象、且易理解、易维护的编程思想。
(小弟不才,理解方面不够严谨,后续有待矫正部分用词)
(1)、Linq To Entity 在执行查询的时候依旧就是要转换成拼接好的 SQL 语句在进行查询,修改、新增操作。
Linq To Entity 很好的展现的面向对象的查询,例子如下:
using (NISMemberEntities nis = new NISMemberEntities())
{
var query = (from m in nis.Bs_Class
where m.id=100
select new ClassEntity
{
ID=m.id,
Name= m.Name
} ).FirstOrDefault();
}
在读这段代码的时候,给开发者的直观感觉就是,数据表成为了一个对象集合,而且我们只是从这个集合中取我们想要的对象。
(2)、我在这里想描述的重点是 Linq to Entity 的分页
using (NISMemberEntities nis = new NISMemberEntities())
{
var query = (from m in nis.Bs_Class
where m.id=100
orderby m.id descending
select m).Skip(startRowIndex).Take(maximumRows);
}
这是一个简单的分页,startRowIndex为查询的起始索引,maximumRows为要显示的条数。(注意,要分页的话,必需要排序,即有orderby语句)
要注意了,这个查询没有条件,我们给它加点条件
using (NISMemberEntities nis = new NISMemberEntities())
{
var query = (from m in nis.Bs_Class
where m.id=100
orderby m.id descending
select m).Skip(startRowIndex).Take(maximumRows);
query = query.where(r=>r.name=="新概念");
}
我们初始化startRowIndex的值为30,maximumRows同样为30,即现在翻到第二页了,第一页是(1-30),第二页(30-30),前为索引,后为查询条数,
在执行上面代码后,我们会发现第二页只显示了6条,有时候又是5条,页数据库显示第二页是有30条记录的,那么这是为什么呢?
原因就在于,我在分页后又执行了条件过滤,即query = query.where(r=>r.name=="新概念");
这就是说,在Linq to Entity 中,分页的执行和 条件过滤是有顺序的,即在条件过滤后在执行分页.
在日常的开发中,习惯性的 将.Skip(startRowIndex).Take(maximumRows);放到了条件过滤之前。
虽然是个简间的问题,但是,先记下来,当以后记。
(3)、我们会常常把结果集返回,比如 query.ToList();
分页一定要在ToList()前执行,我在执行程序中,感觉这样性能更快一些。至于原因,待我去发现发现。
就写到这里,谢谢大家,祝好。