• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    linq to sql 中,如何解决多条件查询问题,答案,用表达式树! (下)
    如何从真正意义上做到延迟加载,即一次只从数据库中取我们需要的用到的那部分数据呢.通过研究,有了下面的方法:
    首先,我们要新建一个静态类,用于存放多条件组合查询的各种组合,比如or,And这些等等.代码如下:
    复制代码 代码如下:

    using System.Linq.Expressions;

    public static class PredicateExtensionses
    {
    public static ExpressionFuncT, bool>> TrueT>() { return f => true; }

    public static ExpressionFuncT, bool>> FalseT>() { return f => false; }

    public static ExpressionFuncT, bool>> OrT>(this ExpressionFuncT, bool>> exp_flow, ExpressionFuncT, bool>> expression2)
    {

    var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.CastSystem.Linq.Expressions.Expression>());

    return System.Linq.Expressions.Expression.LambdaFuncT, bool>>(System.Linq.Expressions.Expression.Or(exp_flow.Body, invokedExpression), exp_flow.Parameters);

    }
    public static ExpressionFuncT, bool>> AndT>(this ExpressionFuncT, bool>> exp_flow, ExpressionFuncT, bool>> expression2)
    {

    var invokedExpression = System.Linq.Expressions.Expression.Invoke(expression2, exp_flow.Parameters.CastSystem.Linq.Expressions.Expression>());

    return System.Linq.Expressions.Expression.LambdaFuncT, 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;
    ExpressionFuncFeedBack, bool>> expr = PredicateExtensionses.TrueFeedBack>();
    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 ExpressionFuncFeedBack, 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多条件组合查询,并且对数据库的请求做到最小化.
    另外,要特别说明的是:对数据源的任何操作,最好用延迟加载,否则,将有可能加载全部数据,
    例如,我们写这样的代码:ListFeedBack> fbs = hm.AllFeedBacks.Where(c=>c.Id > 1000).ToList();这样消耗将会非常严重!因为这里会将FeedBack表所有数据全部加载进来!所以,千万要慎用这种写法.

    总结:微软的linq to sql给我们带来便利的同时,也埋下许多的隐患,比如给像我这样的偷懒者更多便利,但却不去思考,往往一不小心就加载了数据,造成了资源的浪费.在享受这些便利的同时,应注意适时地进行研究,以让它们更好地为我们服务.
    您可能感兴趣的文章:
    • sqlserver和oracle中对datetime进行条件查询的一点区别小结
    • MySql带OR关键字的多条件查询语句
    • Mysql带And关键字的多条件查询语句
    • SQL 多条件查询几种实现方法详细介绍
    • linq to sql中,如何解决多条件查询问题,答案,用表达式树!
    • MySQL中使用case when 语句实现多条件查询的方法
    • SQL Server查询条件IN中能否使用变量的示例详解
    上一篇:asp.net中一个linq分页实现代码
    下一篇:让aspx页面自主控制调用记录的数量,类型,随时更改,不用重新编译的实现方法
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

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