在最近做的人事档案重构项目中,由于需求要求不要用视图、存储过程等,而且这个项目数据库字段的数量实在是令人发指,就我负责的综合信息查询来说,一个页面要显示7张表的数据,字段加起来都百八十个了。
首先看一下数据库结构:
basicInfomation是基本信息表,主键是nowTechnicalRecords(技术档案)的外键。现在页面上要显示的是一部分基本信息表的信息,一部分是技术档案的信息。所以需要根据导航属性进行关联查询。
通过查ef的文档,知道有个方法是用来进行关联查询的:include()。以下是关联查询和真分页的实践:
/// <summary>
/// 分页查询
/// </summary>
/// <typeparam name="Tkey"></typeparam>
/// <param name="pageSize">每页显示条数</param>
/// <param name="pageIndex">第几页</param>
/// <param name="total">总条数</param>
/// <param name="whereLambda">查询条件的lambda表达式</param>
/// <param name="orderbyLambda">排序的lambda表达式</param>
/// <returns></returns>
public List<T_NowTechnicalRecords> QueryBasicInfo<Tkey>(int pageSize, int pageIndex,
out int total, Expression<Func<T_NowTechnicalRecords, bool>> whereLambda,
Expression<Func<T_NowTechnicalRecords, Tkey>> orderbyLambda)
{
renshiEntities db =new renshiEntities(); //定义数据库上下文
total = db.Set<T_NowTechnicalRecords>().Where(whereLambda).Count();//总记录数
var temp = db.T_NowTechnicalRecords.Include("T_BasicInformation") //进行ef查询
.Where(whereLambda)
.OrderBy(orderbyLambda)
.Skip(pageSize * (pageIndex - 1))
.Take(pageSize);
return temp.AsQueryable().ToList();//转换成list
}
这样,在temp中就可以查询到第pageIndex页共有pageSize条数据,数据中,BasicInformation作为NowTechnicalRecords的属性被查询出来。
返回到页面上:
首先要定义model:
@model IEnumerable<TalentServiceCenterFileManage.Model.T_NowTechnicalRecords>
然后在td标签中绑定字段:
<tr>
@*nowTechnicalRecords表字段*@
<th>nowoRiginalTitle</th>
<th>createTime</th>
<th>nowEonDate</th>
@*basicInformation表字段*@
<th>num</th>
<th>name</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.nowoRiginalTitle</td>
<td>@item.createTime</td>
<td>@item.nowEonDate</td>
<td>item.T_BasicInformation.num</td>
<td>item.T_BasicInformation.name</td>
</tr>
}
这样就实现了ef导航属性真分页查询。