一、本節簡介
首先很抱歉,距離上一篇指南已經隔了2周時間,真的發現寫系列很考驗人的耐心和毅力,寫到后面已經沒有當初的興奮,留下的只是一種不想不了了之的念頭,所以這篇指南應該是終結了吧,以后可能會偶爾發一些小技巧和不曾被人注意的地方.
當然,通過本節復雜查詢,各位看官完全可以在自己的項目中隨心所欲的使用XCode,因為通過我一個利用XCode做的項目的結束,基本可以保證能滿足大部分項目能踩到的坑我都踩過了.
二、復雜查詢
在用XCode的時候,我留下的筆記就是以下一段代碼,包括我給我同事使用XCode也只有這樣一段筆記.
//------------------執行sql------------------ 隨便找個實體 Employee.Meta.Query("select * from ") //=================單條件查詢============================ EntityList<Rights> ret; if (Meta.Count >= 1000) ret = FindAll(_.ModuleName, pModulName); else // 實體緩存 ret = Meta.Cache.Entities.FindAll(_.ModuleName, pModulName); //===============單條件查詢,並排序=================================================== if (Meta.Count >= 1000) ret = FindAll(_.PartentID == 0, _.SortIndex.Desc(), null, 0, 0); else ret = Meta.Cache.Entities.FindAll(_.PartentID, pPartentID).Sort(_.SortIndex, true); //================多條件查詢============================ if (Meta.Count >= 1000) ret = FindAll(new String[] {_.UserName, _.IsAccept}, new Object[] {name, 1}); else // 實體緩存 ret = Meta.Cache.Entities.FindAll(e => e.UserName == name && e.IsAccept == 1 ); //==================多條件查詢,並排序===================================================================== if (Meta.Count >= 1000) ret = FindAll(_.UserName == name & _.IsAccept == 1, _.SortIndex.Desc(), null, 0, 0); else // 實體緩存 ret = Meta.Cache.Entities.FindAll(e => e.UserName == name && e.IsAccept == 1 ).Sort(_.SortIndex,true);上面的5個就包含了XCode所有可能會碰到的查詢了.實在不知道怎么寫了,利用執行sql的方法,返回一個DataSet,剩下的你想怎么處理就怎么處理咯.
不過值得注意的是,XCode里有一個廢棄的方法,是FindAll里面是4個參數的,這個方法,在智能提示的時候就已經寫了,我們常用的是5個參數的那個方法.萬一出問題了,先查一查是不是漏了個參數~~不要跟樓主一樣踩這個坑哦~~~
三、舉個例子吧
其實我把上面的一段筆記帖出來后,就不知道寫什么了,因為需要交的內容都在了.這個就像上學的時候的小抄一樣,一點點豆腐干那么大的紙片濃縮了一學期的內容.
舉一個復雜查詢的例子,接着上面幾節的內容的數據庫,我們要查詢某一個科目學生成績,並且以成績從高到低排序(坑爹啊,竟然沒有給學生分班,這里的邏輯有點坑.)
先把數據填上
教師表
然后成績表,自己寫咯這里只寫了一部分數據
大家根據自己數據庫里的外鍵來填寫啊
本來還以為要給Score寫擴展屬性的,結果發現已經寫好了,那么我們就省了給Score寫擴展屬性Subject和Student了.直接開始復雜查詢吧~
這里只是做復雜查詢的演示,所以~~~我就偷懶,界面就粗糙點拉..先到Score.My.cs里寫一段排序代碼
#region 自定義查詢 /// <summary> /// 根據科目id,查詢學生成績,並按成績從大到小排序 /// </summary> /// <param name="pSubjectId"></param> /// <returns></returns> public static EntityList<Score> GetSortedScoreBySubjectID(object pSubjectId) { EntityList<Score> ret; if (Meta.Count >= 1000) ret = FindAll(_.SubjectID == pSubjectId, "Score Desc", null, 0, 0); else ret = Meta.Cache.Entities.FindAll(_.SubjectID, pSubjectId).Sort(_.Score, true); return ret; } #endregion在寫前台前,我們先看一下第一節埋下的坑.導致樓主調試1個小時...其實都怪我,建表叫Score,里面有個列叫Score
![]()
不支持比較...為什么呢...看一下源碼吧
罪魁禍首就在這里...咱們又踩坑了..這個坑埋的不小...還記得第一節我們踩的坑嗎,
數據庫建立了個表叫Score,里面有個屬性也叫Score,然后和class沖突了,
我們把這個屬性改成了MyScore,當時沒出問題,時隔這么久,終於碰到坑了.
這里邏輯有點繞,GetItemType(name) 這個name就是我們傳進去的"Score",或者是_.Score其實也是取到到的"Score"
本來是沒什么問題,但是我們偏偏把Score改成了MyScore,
結果就造成了這里GetItemType取到不到值,所以~~~~就報錯拉...所以把這里改成MyScore就可以了
可以看到這里2個框被修改過了,都怪我表沒建好...
本來上面那個圈里寫的是._.Score.Desc()結果它取到的值是"MyScore Desc"
於是組出來的sql就是 select * from score order by myscore desc,結果可想而知...
學會調試也是必修課啊~~
好了...我們開始前台吧~~~頁面布局開始
<form id="form1" runat="server"> <div> <asp:DropDownList ID="DropDownList1" runat="server" onselectedindexchanged="DropDownList1_SelectedIndexChanged" AutoPostBack="True"> </asp:DropDownList> </div> <div> <asp:GridView ID="GridView1" runat="server" EnableModelValidation="True" AutoGenerateColumns="False"> <Columns> <asp:BoundField DataField="SubjectName" HeaderText="科目" /> <asp:BoundField DataField="StudentName" HeaderText="姓名" /> <asp:BoundField DataField="MyScore" HeaderText="成績" /> </Columns> </asp:GridView> </div> </form>
然后是前台的csprotected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { BindDDL(); } } protected void BindDDL() { EntityList<Subject> subjects = Subject.FindAll(); subjects.Insert(0, new Subject() {ID = 0, Name = "請選擇"}); DropDownList1.DataSource = subjects; DropDownList1.DataValueField = Subject._.ID; DropDownList1.DataTextField = Subject._.Name; DropDownList1.DataBind(); } protected void BindData() { if(DropDownList1.SelectedValue != "0") { EntityList<Score> scoreList = Score.GetSortedScoreBySubjectID(DropDownList1.SelectedValue); GridView1.DataSource = scoreList; GridView1.DataBind(); } } protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e) { BindData(); }最后運行效果就是這樣...
這里其實也沒什么好解釋的.就是綁定綁定數據.其他也沒什么了...分頁和排序..我想寫啊..可是現在這都3點了..還有2個小時要下班了,我還有一些事情沒做完呢...所以見諒了...樓主以后有空一定補全..其實本來這個例子可以不用帖的,但是既然碰到一些坑(主要是我挖的坑,還不能怪xcode),所以怕新手搞不懂怎么弄,所以特意把遇到的問題給帖出來了.主要還是根據文章開頭的筆記,略加修改即可完成大部分任務.本節demoXCode上手指南系列:
NewLife.XCode 上手指南
NewLife.XCode 上手指南(二) 反向工程使用舉例
NewLife.Xcode 上手指南(三) 擴展屬性的使用
NewLife.XCode 上手指南(四) 級聯操作
NewLife論壇地址:
大石頭博客:
NewLife.XCode開發資源目錄
http://www.cnblogs.com/asxinyu/archive/2012/06/02/2532210.html











