激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - linq to sql 中,如何解決多條件查詢問題,答案,用表達式樹! (下)

linq to sql 中,如何解決多條件查詢問題,答案,用表達式樹! (下)

2019-09-18 10:59asp.net之家 ASP.NET教程

在上一篇中,我們做了基于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給我們帶來便利的同時,也埋下許多的隱患,比如給像我這樣的偷懶者更多便利,但卻不去思考,往往一不小心就加載了數據,造成了資源的浪費.在享受這些便利的同時,應注意適時地進行研究,以讓它們更好地為我們服務.

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 亚洲亚色| 国产三级午夜理伦三级 | 久久久久久艹 | 国产午夜亚洲精品午夜鲁丝片 | 久久久久99一区二区三区 | 日韩男人的天堂 | 视频精品一区 | 九九热精| 精品一区二区三区中文字幕老牛 | 99影视电影电视剧在线播放 | 精品中文字幕视频 | 国产精品久久久免费看 | 免费在线观看成人av | 久久久久电影网站 | 国产精品视频导航 | 91av久久| 91精品国产福利尤物免费 | 久久最新视频 | 国产成人av免费看 | 国产精品成人一区二区三区电影毛片 | 日韩av成人| 午夜在线视频一区二区三区 | 素人视频免费观看 | 国产精品一区二区手机在线观看 | 色97色| 成人福利软件 | 免费a级毛片大学生免费观看 | 日韩欧美精品电影 | 久国久产久精永久网页 | 久久精品视频69 | 中国大陆高清aⅴ毛片 | 久草视频在线看 | 九九视屏| 亚洲一区二区三区精品在线观看 | 免费在线观看一级片 | 5xsq在线视频 | 久久蜜桃精品一区二区三区综合网 | 日本娇小videos高潮 | 国产无遮挡成人免费视频 | 欧美一级特黄aaaaaaa什 | 中文字幕在线观看亚洲 |