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

 更新时间:2011年08月17日 23:42:18   作者:   我要评论
在上一篇中,我们做了基于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给我们带来便利的同时,也埋下许多的隐患,比如给像我这样的偷懒者更多便利,但却不去思考,往往一不小心就加载了数据,造成了资源的浪费.在享受这些便利的同时,应注意适时地进行研究,以让它们更好地为我们服务.

相关文章

  • VS2013安装提示必须安装ie10的解决办法

    VS2013安装提示必须安装ie10的解决办法

    这篇文章主要为大家详细介绍了VS2013安装提示必须安装ie10的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • ASP.NET中控件的EnableViewState属性及彻底禁用

    ASP.NET中控件的EnableViewState属性及彻底禁用

    如果我们在开发Web应用程序时,某些控件是不需要接受用户的操作或只需要接受一次操作的时候,我们可以将这些控件的EnableViewState属性改为false,这样可以优化我们的程序,提高网络访问的速度。
    2016-06-06
  • ADO.NET编程之基础知识

    ADO.NET编程之基础知识

    ADO.NET是专门为帮助开发人员建立在Intranet或Internet上使用的高效多层金沙国际官网应用程序而设计的,它作为Windows平台下开发应用系统的数据访问技术,已经在企业信息系统的开发中得到了广泛的应用。
    2015-06-06
  • ABP入门系列之分页功能的实现

    ABP入门系列之分页功能的实现

    本节主要讲解了如何使用ABP进行后台分页,并顺带讲解了ABP后台分页逻辑的实现方式。同时也演示了如何使用X.PagedList进行前端分页
    2017-03-03
  • ASP.NET GridView控件在列上格式化时间及DataFormatString使用

    ASP.NET GridView控件在列上格式化时间及DataFormatString使用

    在GridView绑定日期格式的时候,金沙国际官网中的日期为2008-07-04,而GridView显示的是2007-07-04 000000,多了后面一截很不美观,想把它去掉不知道有什么好的方法,感兴趣的朋友可以了解本文,或许对你有所帮助
    2013-01-01
  • ASP.NET页面传递值的方式介绍

    ASP.NET页面传递值的方式介绍

    面传值是学习asp.net初期都会面临的一个问题,总的来说有页面传值、存储对象传值、ajax、类、model、表单等。但是一般来说,常用的较简单有QueryString,Session,Cookies,Application,Server.Transfer。
    2012-12-12
  • C# 无限级分类的实现

    C# 无限级分类的实现

    采用存储过程实现递归逻辑,直接返回子分类列表的方式应该有更好的性能,尤其是Web服务器与金沙国际官网服务器不位于同一台服务器上时,更会受网络影响。
    2009-02-02
  • asp.net用三层实现多条件检索示例

    asp.net用三层实现多条件检索示例

    三层将项目分为界面层,业务逻辑层和数据访问层,下面为大家介绍下asp.net如何用三层实现多条件检索,感兴趣的朋友可以参考下
    2014-07-07
  • ASP.NET MVC中的AJAX应用

    ASP.NET MVC中的AJAX应用

    这篇文章主要介绍了ASP.NET MVC中的AJAX应用的相关资料,需要的朋友可以参考下
    2014-10-10
  • .net core并发下线程安全问题详解

    .net core并发下线程安全问题详解

    这篇文章主要给大家介绍了关于.net core并发下线程安全问题的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用.net core具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论