none
EntityFramework 分页问题 RRS feed

  • 问题

  • 下面这段代码是实现分页演示,我有些问题想问一下。

    请看代码:

            public IEnumerable<TEntity> Selects<TEntity>(Expression<Func<TEntity, bool>> where, int pageIndex, int pageSize, out int rowAmount) where TEntity : class
            {
                //1.
                IQueryable<TEntity> rows = this.Context.Set<TEntity>();
                //2.
                rowAmount = rows.Count();
                return rows.Where(where).Skip(pageIndex < 1 ? 0 : ((pageIndex - 1) * pageSize)).Take(pageSize);
                //3.
                //this.Context.Set<TEntity>().Where(where).Skip(pageIndex < 1 ? 0 : ((pageIndex - 1) * pageSize)).Take(pageSize);
            }

    1.问题(1)位置,我想问这样的查询方式 是不是会查询数据库表中的所有数据。如果表中数据量很大的话是不是效率很低?

    2.问题(2)位置,事例代码中是用这种方式获得表中所有的数据大小。在这里我想有没有别的更好的方式获取表中总数量的所有大小。PS:方法中我所有的where参数全都是Expression树。所有我想有没有一种方式能通过Expression树效率的查询数据表中所有数据的总数。

    3.问题(3)位置,这行代码分别使用Where和Skip和Take。我想问的是这句话是先用Where执行持久数据库查询,然后将查询到的数据在内存中Skip和Take还是整句话是先将Where和Skip和Take组合成一个SQL在进行到持久数据库的查询。

    希望大家能帮助下我,谢谢~!
    • 已编辑 Rainrcn 2012年4月16日 6:51
    2012年4月16日 6:13

答案

  • 您好,

    问题一:在位置一只是定义了一个查询表达式,并不会去查询数据库,在位置二处调用Count时才会真正查询数据库。

    问题二:通常示例代码中提供的方法都是最简便有效的方法,当你调用Count方法时,查询表达式会先被转译为表达式树,再被转译为T-SQL去数据库中执行,返回查询到的记录总数。

    问题三:整个查询表达式会被翻译为T-SQL直接在数据库中执行,不会先把所有记录加载到内存后再进行分页。

    希望这些对您有帮助!


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Rainrcn 2012年4月18日 4:26
    2012年4月17日 2:12
    版主

全部回复

  • 您好,

    问题一:在位置一只是定义了一个查询表达式,并不会去查询数据库,在位置二处调用Count时才会真正查询数据库。

    问题二:通常示例代码中提供的方法都是最简便有效的方法,当你调用Count方法时,查询表达式会先被转译为表达式树,再被转译为T-SQL去数据库中执行,返回查询到的记录总数。

    问题三:整个查询表达式会被翻译为T-SQL直接在数据库中执行,不会先把所有记录加载到内存后再进行分页。

    希望这些对您有帮助!


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    • 已标记为答案 Rainrcn 2012年4月18日 4:26
    2012年4月17日 2:12
    版主
  • 很感谢您的回答,但是我用Sql Profiler 检测到的查询语句并不是那样子。还是只能是linq 的语句才能被转化成T-SQL?

    请看图:

    2012年4月17日 13:51
  • 您好,使用LINQ查询语句的话,在执行时它会先被翻译为查询树,再被翻译为T-SQL在数据库中执行。所以,只有你的LINQ语句能被Provider识别时它最后才会被翻译为T-SQL。下面是我写的一个简单的分页语句以及SQL Server Profiler的截图,页码和每页显示数据都写死在里面了。

    var query = context.Players.OrderBy(x=>x.TeamID).Skip(5).Take(5).ToList();


    Allen Li [MSFT]
    MSDN Community Support | Feedback to us

    2012年4月18日 2:23
    版主
  • 谢谢了~
    2012年4月18日 4:26