标签:
EF数据延迟加载
using System;
using System.Collections.Generic;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace MvcTest.Controllers
{
public class TestController : Controller
{
salesEntities db = new salesEntities();
public ActionResult Index()
{
//它会把所有的数据都查询出来,放到内存中,然后再从这些所有的数据中再跳过5条,取10条数据,即取:6-15条的数据 ;
// 它执行的时候SQL语句是 :select * from T_User (这想想为什么他的SQL语句是select * from T_User ,而不是像下面例子那样?其实道理很简单,因为 我们在(from a in db.T_User select a)的后面就toList()了,我们只是如果ToList()就是执行数据库,所以此时它已经去执行数据库了。将这条语句查询到的所有数据都加载到了内存当中,然后再执行后面的.ToList().Skip(5).Take(10); 也就是说,它是在内存中的数据进行刷选了。所以它执行的sql语句就是select * from T_User了
IEnumerable<T_User> query1 = (from a in db.T_User
select a).ToList().Skip(5).Take(10);
//---------------------------------------------------------------------------------------------
//它只会查询在数据库中第6-15条之间的数据 即取:6-15条的数据
//因为我们是最后ToList()的,所以它是先准备select top 10* from (select * ,ROW_NUMBER() over(order by id asc) as rowNum from T_User ) as t1 where t1.rowNum>5 order by t1.Id asc 这么一条sql语句,然后再ToList()的时候去查询数据库
IEnumerable<T_User> query2 = (from a in db.T_User
select a).OrderBy(r => r.Id).Skip(5).Take(10).ToList(); //注意:ToList()的返回类型是:IEnumerable<T>
//它只会查询在数据库中第6-15条之间的数据 即取:6-15条的数据 它执行的时候SQL语句是
//select top 10* from (select * ,ROW_NUMBER() over(order by id asc) as rowNum from T_User ) as t1 where t1.rowNum>5 order by t1.Id asc
IQueryable<T_User> query3 = (from a in db.T_User
select a).OrderBy(r => r.Id).Skip(5).Take(10);
//其实这里的query真实的类型是DbQuery<T_User> 之所以我们在这里用IQueryable<T_User>来接收它,是因为form语句是以IQueryable<T_User>这个接口的形式来返回数据的
//EF之所以可以实现延迟加载,就是因为有了DbQuery这个类。(所谓延迟加载就是:只有当使用到数据的时候才去查询数据库)
//DbQuery<T_User> query = ((from a in db.T_User
// select a).OrderBy(r => r.Id).Skip(5).Take(10)) as DbQuery<T_User>;
ViewBag.Data = query3;
return View();
} //就算执行到“}”这一步的时候 query3都是没有数据的。它仅仅是准备了一条sql语句。并没有执行这条语句。也就是说他没有查询数据库(它真正的去查询数据库的时候是在页面上使用的时候 比如在视图Index页面上执行@foreach(var a in viewBag.Data)的时候才会去查询数据库
}
}
Index视图
@{
Layout = null;
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>Index</title>
<script src="~/Scripts/jquery-1.8.2.js"></script>
</head>
<body>
<div>
@foreach (var i in ViewBag.Data)
{
@i.UserName <br/>
}
</div>
</body>
</html>标签:
原文地址:http://blog.csdn.net/fanbin168/article/details/45287937