现在的位置: 首页 > 综合 > 正文

Linq To Entity 的分页讨论

2013年01月19日 ⁄ 综合 ⁄ 共 2171字 ⁄ 字号 评论关闭

最近在使用 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()前执行,我在执行程序中,感觉这样性能更快一些。至于原因,待我去发现发现。

 

                                                                就写到这里,谢谢大家,祝好。

                  

 

抱歉!评论已关闭.