MVC中使用Linq To Sql进行数据查询及分页
2010-09-10 16:38
846 查看
这两天一直在研究MVC中使用LINQ TO SQL实现多表查询及分页功能,参照之前的LINQ项目和网上资料,基本实现了两个表查询及分页功能
假如有两个表 student学生表和stujz家长表,两个表的对应关系是student.id自增等于stujz.stuid。
student表
stujz表
实现过程:
一、在Model层使用Linq的查询语句查询数据
二、将Linq查询结果转成List<T>
三、由Control层将查询结果存入页面数据模型
代码如下:
Model层代码: ...
public class StudentsModel
{
private StudentsDbDataContext _dataContext = new StudentsDbDataContext();
//使用Linq查询语句方式查询记录
public IList<ResultModel.ResultStudentsList> ListAll(int intPageStart,int intPageEnd)
{
//加上.Skip().Take()语句,相当于Sqlserver的row_number()作用,查询时分页
var strudents = (from s in _dataContext.student
join j in _dataContext.stujz on s.id equals j.stuid
select new { s.stuname, s.stusex, s.stunl, j.jzname, j.jzphone }).Skip(intPageStart).Take(intPageEnd);
List<ResultModel.ResultStudentsList> list = ChangeLinqToList(strudents);
return list;
}
}
/// <summary>
/// 将Linq 查询结果转成List<T>
/// </summary>
/// <typeparam name="T">Linq查询的结果集的结构</typeparam>
/// <param name="data">Linq查询的结果集</param>
/// <returns>List<T></returns>
public static List<ResultModel.ResultStudentsList> ChangeLinqToList<T>(IEnumerable<T> data)
{
//返回查询结果
List<ResultModel.ResultStudentsList> retlist = new List<ResultModel.ResultStudentsList>();
//获得泛型类型的属性
var objProperty = System.ComponentModel.TypeDescriptor.GetProperties(typeof(T));
//遍历结果集
foreach (T t in data)
{
ResultModel.ResultStudentsList _model = new ResultModel.ResultStudentsList();
//获得数据模型的实例
Type type = _model.GetType();
//遍历数据集每行中每列的值
foreach (System.ComponentModel.PropertyDescriptor objProDescriptor in objProperty)
{
//将值装箱,这样可以防止类型不匹配
object o = objProDescriptor.GetValue(t);
//将装箱后的值存入数据模型中对应的字段中
type.GetField("_" + objProDescriptor.Name).SetValue(_model, o);
}
//给返回的结果集添加一条记录
retlist.Add(_model);
}
//返回查询的结果集
return retlist;
}
Control层代码如下: ...
public ActionResult StudentList(int? page)
{
//使用Linq To Sql实现数据查询
IEnumerable<ResultModel.ResultStudentsList> modellist = _repository.ListAll();//Linq查询语句方式
//定义返回给页面的数据模型
var viewData = new ModelStudentData();
//将结果存入数据模型
viewData.StudentList= modellist;
return View(viewData);
}
View层代码如下: ...
<p>统计学生: </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="list">
<tr>
<th>学生姓名</th>
<th>学生性别</th>
<th>学生年龄</th>
<th>家长姓名</th>
<th>家长手机</th>
</tr>
<% foreach (var item in Model.StudentList){%>
<tr>
<td align="center">
<%=item.stuname%>
</td>
<td align="center">
<%=item.stusex%>
</td>
<td align="center">
<%=item.stunl%>
</td>
<td align="center">
<%=item.jzname%>
</td>
<td align="center">
<%=item.jzphone%>
</td>
</tr>
<% } %>
</table>
刚接触MVC+Linq的开发,所以实现的有些麻烦,应该有更好的实现方式。
假如有两个表 student学生表和stujz家长表,两个表的对应关系是student.id自增等于stujz.stuid。
student表
stujz表
实现过程:
一、在Model层使用Linq的查询语句查询数据
二、将Linq查询结果转成List<T>
三、由Control层将查询结果存入页面数据模型
代码如下:
Model层代码: ...
public class StudentsModel
{
private StudentsDbDataContext _dataContext = new StudentsDbDataContext();
//使用Linq查询语句方式查询记录
public IList<ResultModel.ResultStudentsList> ListAll(int intPageStart,int intPageEnd)
{
//加上.Skip().Take()语句,相当于Sqlserver的row_number()作用,查询时分页
var strudents = (from s in _dataContext.student
join j in _dataContext.stujz on s.id equals j.stuid
select new { s.stuname, s.stusex, s.stunl, j.jzname, j.jzphone }).Skip(intPageStart).Take(intPageEnd);
List<ResultModel.ResultStudentsList> list = ChangeLinqToList(strudents);
return list;
}
}
/// <summary>
/// 将Linq 查询结果转成List<T>
/// </summary>
/// <typeparam name="T">Linq查询的结果集的结构</typeparam>
/// <param name="data">Linq查询的结果集</param>
/// <returns>List<T></returns>
public static List<ResultModel.ResultStudentsList> ChangeLinqToList<T>(IEnumerable<T> data)
{
//返回查询结果
List<ResultModel.ResultStudentsList> retlist = new List<ResultModel.ResultStudentsList>();
//获得泛型类型的属性
var objProperty = System.ComponentModel.TypeDescriptor.GetProperties(typeof(T));
//遍历结果集
foreach (T t in data)
{
ResultModel.ResultStudentsList _model = new ResultModel.ResultStudentsList();
//获得数据模型的实例
Type type = _model.GetType();
//遍历数据集每行中每列的值
foreach (System.ComponentModel.PropertyDescriptor objProDescriptor in objProperty)
{
//将值装箱,这样可以防止类型不匹配
object o = objProDescriptor.GetValue(t);
//将装箱后的值存入数据模型中对应的字段中
type.GetField("_" + objProDescriptor.Name).SetValue(_model, o);
}
//给返回的结果集添加一条记录
retlist.Add(_model);
}
//返回查询的结果集
return retlist;
}
Control层代码如下: ...
public ActionResult StudentList(int? page)
{
//使用Linq To Sql实现数据查询
IEnumerable<ResultModel.ResultStudentsList> modellist = _repository.ListAll();//Linq查询语句方式
//定义返回给页面的数据模型
var viewData = new ModelStudentData();
//将结果存入数据模型
viewData.StudentList= modellist;
return View(viewData);
}
View层代码如下: ...
<p>统计学生: </p>
<table border="0" cellspacing="0" cellpadding="0" width="100%" class="list">
<tr>
<th>学生姓名</th>
<th>学生性别</th>
<th>学生年龄</th>
<th>家长姓名</th>
<th>家长手机</th>
</tr>
<% foreach (var item in Model.StudentList){%>
<tr>
<td align="center">
<%=item.stuname%>
</td>
<td align="center">
<%=item.stusex%>
</td>
<td align="center">
<%=item.stunl%>
</td>
<td align="center">
<%=item.jzname%>
</td>
<td align="center">
<%=item.jzphone%>
</td>
</tr>
<% } %>
</table>
刚接触MVC+Linq的开发,所以实现的有些麻烦,应该有更好的实现方式。
相关文章推荐
- MVC中使用LINQ TO SQL实现多表查询及分页
- Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- [导入]Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- 在asp.net mvc中创建使用Linq to sql的分页控件
- VS2008下使用Linq To Entity的Skip().Take()分页查询时遇到数据结果不对的问题
- 在asp.net mvc中创建使用Linq to sql的分页控件[转]
- Silverlight 2 (beta1)数据操作(5)——使用LINQ to SQL进行数据CRUD操作(上)
- Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
- 使用Linq查询数据进行分页时遇到的性能问题
- Silverlight ——使用LINQ to SQL进行数据CRUD操作(上)
- mvc Linq TO sql 数据模型添加标记进行模型验证
- Silverlight 2 (beta1)数据操作(6)——使用LINQ to SQL进行数据CRUD操作(下)
- Linq to sql:使用存储过程删除数据
- VB.NET中使用Linq TO SQL添加数据后获得自增长列ID
- Mybatis 使用Mapper接口的Sql动态代码方式进行CURD和分页查询
- 扩展LINQ to SQL:使用Lambda Expression批量删除数据
- LINQ to SQL 查询数据库和使用存储过程
- LINQ to SQL 系列 如何使用LINQ to SQL插入、修改、删除数据
- 在Excel中使用SQL语句对多个数据表进行精确筛选 (查询)
- 在Linq to Sql中管理并发更新时的冲突(3):使用记录的时间戳进行检测