gpt4 book ai didi

linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章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给我们带来便利的同时,也埋下许多的隐患,比如给像我这样的偷懒者更多便利,但却不去思考,往往一不小心就加载了数据,造成了资源的浪费.在享受这些便利的同时,应注意适时地进行研究,以让它们更好地为我们服务. 。

最后此篇关于linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)的文章就讲到这里了,如果你想了解更多关于linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com