日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(转)动态Entity Framework查询:Dynamic Query 介绍

發(fā)布時(shí)間:2023/12/18 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)动态Entity Framework查询:Dynamic Query 介绍 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文地址:http://www.cnblogs.com/yinzixin/archive/2012/11/30/entity-framework-dynamic-query.html

Dynamic Query是一個(gè)支持動(dòng)態(tài)Entity Framework查詢的庫(kù)。它的設(shè)計(jì)初衷是為了減少在管理系統(tǒng)中大量出現(xiàn)的對(duì)一個(gè)數(shù)據(jù)集進(jìn)行查找、排序、分頁(yè)的這類場(chǎng)景的開(kāi)發(fā)工作量,其設(shè)計(jì)思想是”markup is code ”。通過(guò)在View上編寫具有語(yǔ)義信息的標(biāo)簽,來(lái)實(shí)現(xiàn)這類常見(jiàn)的功能需求,而不再需要額外的代碼。它不是一個(gè)完整的ORM,是基于Entity Framework的,因此開(kāi)發(fā)者仍然可以利用Entity Framework提供的大量特性,和現(xiàn)有的EF項(xiàng)目保持兼容。

Dynamic Query分為兩個(gè)部分,其中之一是一個(gè)查詢接口,這是一個(gè)IQueryable<T>的擴(kuò)展方法:

public static IQueryable<T> Query<T>(this IQueryable<T> data, QueryDescriptor descriptor)

?

其中QueryDescriptor是一個(gè)簡(jiǎn)單的類,包含了一個(gè)查詢的必要信息,例如,篩選條件,排序信息,分頁(yè)信息等。

例如:

QueryDescriptor descriptor = new QueryDescriptor{OrderBy = new OrderByClause { Key = "Price", Order = OrderSequence.ASC },PageSize = 3,PageIndex = 1,Conditions=new QueryCondition[] {new QueryCondition { Key = "Name",Value = "Rice", Operator = QueryOperator.CONTAINS }}};int pageCount;var res=ctx.Products.Query(descriptor, out pageCount);

這相當(dāng)于執(zhí)行了查詢:

select * from Product where [Name] like N'%Rice%' order by Price asc

并且對(duì)結(jié)果進(jìn)行分頁(yè),每頁(yè)3條數(shù)據(jù),返回第一頁(yè)。注意,這里返回的結(jié)果是IQueryable<T>,這實(shí)際上是一個(gè)Entity Framework的查詢,在沒(méi)有序列化之前,并沒(méi)有對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作,分頁(yè)也是發(fā)生在服務(wù)器端的,這對(duì)于大數(shù)據(jù)來(lái)說(shuō)能夠極大的減少網(wǎng)絡(luò)傳輸和內(nèi)存使用量。 當(dāng)然,手動(dòng)構(gòu)造這樣一個(gè)QueryDescriptor也是一件非常無(wú)趣的事情,為此Dynamic Query還為asp.net MVC 實(shí)現(xiàn)了一系列的helper方法和一個(gè)model binder,來(lái)自動(dòng)生成QueryDescriptor。我們最終的目標(biāo)是獲得頁(yè)面提交的數(shù)據(jù),自動(dòng)生成QueryDescriptor對(duì)象。為此,需要注冊(cè)一下一個(gè)自定義的binder,只需要在Global.asax的Application_Start中添加一行代碼:

ModelBinders.Binders.Add(typeof(QueryDescriptor), new QueryDescriptorBinder());

?

假如我們有如下的EF模型:

我們來(lái)實(shí)現(xiàn)一個(gè)列表,對(duì)Product的Name進(jìn)行篩選。這時(shí)候,可以使用QueryTextbox擴(kuò)展方法來(lái)生成查詢字段,View的代碼如下:

<div class="container"> <form class=".form-search">@Html.QueryTextbox("Name", "Product Name", QueryOperator.CONTAINS) <input type="submit" value="Search" class="btn"/></form> </div> <div class="row"><div class="span12 offset2 "><table class="table table-striped"><thead><tr><td>ID</td><td>Category</td><td>Name</td><td>Price</td><td>Description</td></tr></thead><tbody>@foreach (var p in @Model){<tr><td>@p.Id</td><td>@p.Category.Name</td><td>@p.Name</td><td>@p.Price</td><td>@p.Description</td></tr>}</tbody></table></div> </div>

?

上半部分是一個(gè)form,里面有一個(gè)QueryTextBox,下半部分就是一個(gè)列表,非常簡(jiǎn)單。看對(duì)應(yīng)的Action:

public ActionResult Index(QueryDescriptor descriptor){ShopContainer ctx = new ShopContainer();var result = ctx.Products.Query(descriptor);return View("Product",result);}

由于Model Binder的存在,Action會(huì)從頁(yè)面獲得QueryDescriptor的信息。這樣一個(gè)篩選頁(yè)面就做好了。如果客戶說(shuō),我還要增加對(duì)種類名稱和價(jià)格范圍的篩選,那需要改什么地方?只需要在View的form中添加幾個(gè)QueryTextbox就可以了

<form class=".form-search">@Html.QueryTextbox("Name", "Product Name", QueryOperator.CONTAINS)@Html.QueryTextbox("Category.Name", "Product Category", QueryOperator.CONTAINS)@Html.QueryTextbox("Price.1", "Price Between", QueryOperator.GREATEROREQUAL,"decimal")@Html.QueryTextbox("Price.2", "", QueryOperator.LESSOREQUAL,"decimal")<input type="submit" value="Search" class="btn"/></form>

注意,Price出現(xiàn)了兩次,需要加上數(shù)字后綴區(qū)分一下就可以,如果不是string類型,加上類型的說(shuō)明,這樣就OK。Action方法是不需要有任何改動(dòng)的。

如果客戶說(shuō)這個(gè)要分頁(yè)怎么辦? 分頁(yè)需要稍微多些兩行代碼,但是也只需要2分鐘就足夠,先看Action方法:

public ActionResult Product(QueryDescriptor descriptor){descriptor.PageSize = 5;descriptor.OrderBy = new OrderByClause { Key = "Id", Order = OrderSequence.ASC };ShopContainer ctx = new ShopContainer();int pageCount;var result = ctx.Products.Query(descriptor, out pageCount);Pager pager = new Pager(pageCount, descriptor);ViewBag.Pager = pager;return View("Index",result);}

首先指定一頁(yè)顯示的數(shù)量,因?yàn)橐猪?yè),必須要有排序信息,這里是根據(jù)Id,升序排列。接下來(lái)還是調(diào)用Query方法獲得數(shù)據(jù),注意,這里是Query的一個(gè)重載的方法,能夠返回總共有多少頁(yè),這一般是分頁(yè)控件需要的信息。接下來(lái)實(shí)例化一個(gè)Pager對(duì)象,這個(gè)Pager是一個(gè)分頁(yè)器,包含在Dynamic Query中,如果你想用其他第三方的分頁(yè)器,也是可以的。Pager需要的額外信息就是總頁(yè)數(shù),把這個(gè)Pager放到ViewBag上面,然后Action的工作就完成了。View上面也不想要任何改變,如果你想加上分頁(yè)鏈接的話,只需要一行代碼:

@Html.QueryPager((Pager)ViewBag.Pager);

看看效果:

?

項(xiàng)目主頁(yè)和源代碼在:http://dynamicquery.codeplex.com/? 上面有一個(gè)樣例程序,更多文檔在完善中。

這個(gè)項(xiàng)目才開(kāi)始沒(méi)多久,還有很多細(xì)節(jié)需要完善,主要是樣式、支持更多的控件,比如checkbox,dropdownlist等。以后慢慢補(bǔ)充。

轉(zhuǎn)載于:https://www.cnblogs.com/fcsh820/archive/2012/12/06/2804595.html

總結(jié)

以上是生活随笔為你收集整理的(转)动态Entity Framework查询:Dynamic Query 介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。