如何从真正意义上做到延迟加载,即一次只从数据库中取我们需要的用到的那部分数据呢.通过研究,有了下面的方法:
首先,我们要新建一个静态类,用于存放多条件组合查询的各种组合,比如or,And这些等等.代码如下:
复制代码 代码如下:
using System.Linq.Expressions;
public static class PredicateExtensionses
{
public static Expression<Func<T, bool True<T>() { return f => true; }
public static Expression<Func<T, bool False<T>() { return f => false; }
public static Expression<Func<T, bool Or<T>(this Expression<Func<T, bool exp_flow, Expression<Func<T, bool expression2)
{
var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.Cast<System.Linq.Expressions.Expression>());
return System.Linq.Expressions.Expression.Lambda<Func<T, bool(System.Linq.Expressions.Expression.Or(exp_flow.Body, invokedExpression), exp_flow.Parameters);
}
public static Expression<Func<T, bool And<T>(this Expression<Func<T, bool exp_flow, Expression<Func<T, bool expression2)
{
var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.Cast<System.Linq.Expressions.Expression>());
return System.Linq.Expressions.Expression.Lambda<Func<T, bool(System.Linq.Expressions.Expression.And(exp_flow.Body, invokedExpression), exp_flow.Parameters);
}
}
第一步工作完成后,我们就可以从具体应用层面上来调用这种组合了,此处,我们仍以FeedBack表对象为例,表示层调用代码如下:
我仅列举核心代码,注意:PageNavigator1是我页面的分页控件.
分页代码:
复制代码 代码如下:
private void ListDataBind(int pageIndex)
{
int rowCount = 0;
int pageCount = 0;
int pageSize = 30;
Expression<Func<FeedBack, bool expr = PredicateExtensionses.True<FeedBack>();
GetCondition(ref expr);
var hs = from h in hm.AllFeedBacks.Where(expr) select h;//延迟加载,数据库没有任何操作
if (pageIndex == 1)//如果是第一次取数据,需要获取符合条件的总记录条数
{
rowCount = hs.Count();//数据库进行一次Count操作
}
else//之后的记录条数,从分页控件持久态的属性中获取,省去一次Count查询
{
rowCount = PageNavigator1.RecordCount;
}
pageCount = rowCount > pageSize ? Convert.ToInt32((rowCount - 1) / pageSize) + 1 : 1;//通用分页算法
if (pageIndex > pageCount)
{
pageIndex = pageCount;
}
var pageData = hs.Skip(pageSize * (pageIndex - 1)).Take(pageSize);//这里也是延迟加载,数据库此时不操作
FeedBackManageList.DataSource = pageData;//这里才正式加载数据,仅仅向数据库发出请求30条记录SQL
FeedBackManageList.DataBind();
PageNavigator1.RecordCount = rowCount;// 给分页控件一些数据
PageNavigator1.PageCount = pageCount;//给分页控件一些数据
PageNavigator1.PageIndex = pageIndex;//给分页控件一些数据
}
接下来是关键部分,组合条件,注意这里,我们用到了第一步中定义好的组合类:
复制代码 代码如下:
private void GetCondition(ref Expression<Func<FeedBack, bool expr) {
int isLock = Int32.Parse(ddlIsLock.SelectedValue);
if (isLock > -1)
{
expr = expr.And(c => (c.IsLock == isLock));//一次组合
}
string keyword = tbxKeyword.Text.FilterInjectStr();
if (!keyword.IsNullOrEmpty())
{
expr = expr.And(c => (c.HotelName.IndexOf(keyword) > -1)); //二次组合
}
}
到此,我们已经完成了linq to Sql多条件组合查询,并且对数据库的请求做到最小化.
另外,要特别说明的是:对数据源的任何操作,最好用延迟加载,否则,将有可能加载全部数据,
例如,我们写这样的代码:List<FeedBack> fbs = hm.AllFeedBacks.Where(c=>c.Id > 1000).ToList();这样消耗将会非常严重!因为这里会将FeedBack表所有数据全部加载进来!所以,千万要慎用这种写法.
总结:微软的linq to sql给我们带来便利的同时,也埋下许多的隐患,比如给像我这样的偷懒者更多便利,但却不去思考,往往一不小心就加载了数据,造成了资源的浪费.在享受这些便利的同时,应注意适时地进行研究,以让它们更好地为我们服务.
首先,我们要新建一个静态类,用于存放多条件组合查询的各种组合,比如or,And这些等等.代码如下:
复制代码 代码如下:
using System.Linq.Expressions;
public static class PredicateExtensionses
{
public static Expression<Func<T, bool True<T>() { return f => true; }
public static Expression<Func<T, bool False<T>() { return f => false; }
public static Expression<Func<T, bool Or<T>(this Expression<Func<T, bool exp_flow, Expression<Func<T, bool expression2)
{
var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.Cast<System.Linq.Expressions.Expression>());
return System.Linq.Expressions.Expression.Lambda<Func<T, bool(System.Linq.Expressions.Expression.Or(exp_flow.Body, invokedExpression), exp_flow.Parameters);
}
public static Expression<Func<T, bool And<T>(this Expression<Func<T, bool exp_flow, Expression<Func<T, bool expression2)
{
var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.Cast<System.Linq.Expressions.Expression>());
return System.Linq.Expressions.Expression.Lambda<Func<T, bool(System.Linq.Expressions.Expression.And(exp_flow.Body, invokedExpression), exp_flow.Parameters);
}
}
第一步工作完成后,我们就可以从具体应用层面上来调用这种组合了,此处,我们仍以FeedBack表对象为例,表示层调用代码如下:
我仅列举核心代码,注意:PageNavigator1是我页面的分页控件.
分页代码:
复制代码 代码如下:
private void ListDataBind(int pageIndex)
{
int rowCount = 0;
int pageCount = 0;
int pageSize = 30;
Expression<Func<FeedBack, bool expr = PredicateExtensionses.True<FeedBack>();
GetCondition(ref expr);
var hs = from h in hm.AllFeedBacks.Where(expr) select h;//延迟加载,数据库没有任何操作
if (pageIndex == 1)//如果是第一次取数据,需要获取符合条件的总记录条数
{
rowCount = hs.Count();//数据库进行一次Count操作
}
else//之后的记录条数,从分页控件持久态的属性中获取,省去一次Count查询
{
rowCount = PageNavigator1.RecordCount;
}
pageCount = rowCount > pageSize ? Convert.ToInt32((rowCount - 1) / pageSize) + 1 : 1;//通用分页算法
if (pageIndex > pageCount)
{
pageIndex = pageCount;
}
var pageData = hs.Skip(pageSize * (pageIndex - 1)).Take(pageSize);//这里也是延迟加载,数据库此时不操作
FeedBackManageList.DataSource = pageData;//这里才正式加载数据,仅仅向数据库发出请求30条记录SQL
FeedBackManageList.DataBind();
PageNavigator1.RecordCount = rowCount;// 给分页控件一些数据
PageNavigator1.PageCount = pageCount;//给分页控件一些数据
PageNavigator1.PageIndex = pageIndex;//给分页控件一些数据
}
接下来是关键部分,组合条件,注意这里,我们用到了第一步中定义好的组合类:
复制代码 代码如下:
private void GetCondition(ref Expression<Func<FeedBack, bool expr) {
int isLock = Int32.Parse(ddlIsLock.SelectedValue);
if (isLock > -1)
{
expr = expr.And(c => (c.IsLock == isLock));//一次组合
}
string keyword = tbxKeyword.Text.FilterInjectStr();
if (!keyword.IsNullOrEmpty())
{
expr = expr.And(c => (c.HotelName.IndexOf(keyword) > -1)); //二次组合
}
}
到此,我们已经完成了linq to Sql多条件组合查询,并且对数据库的请求做到最小化.
另外,要特别说明的是:对数据源的任何操作,最好用延迟加载,否则,将有可能加载全部数据,
例如,我们写这样的代码:List<FeedBack> fbs = hm.AllFeedBacks.Where(c=>c.Id > 1000).ToList();这样消耗将会非常严重!因为这里会将FeedBack表所有数据全部加载进来!所以,千万要慎用这种写法.
总结:微软的linq to sql给我们带来便利的同时,也埋下许多的隐患,比如给像我这样的偷懒者更多便利,但却不去思考,往往一不小心就加载了数据,造成了资源的浪费.在享受这些便利的同时,应注意适时地进行研究,以让它们更好地为我们服务.
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
暂无评论...
更新日志
2024年11月29日
2024年11月29日
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]