NewLife.XCode 上手指南(五) 復雜查詢


一、本節簡介

       首先很抱歉,距離上一篇指南已經隔了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個參數的那個方法.萬一出問題了,先查一查是不是漏了個參數~~不要跟樓主一樣踩這個坑哦~~~
image

三、舉個例子吧

      其實我把上面的一段筆記帖出來后,就不知道寫什么了,因為需要交的內容都在了.這個就像上學的時候的小抄一樣,一點點豆腐干那么大的紙片濃縮了一學期的內容.

舉一個復雜查詢的例子,接着上面幾節的內容的數據庫,我們要查詢某一個科目學生成績,並且以成績從高到低排序(坑爹啊,竟然沒有給學生分班,這里的邏輯有點坑.)

      先把數據填上

學生表
image
科目表

image

教師表

image

然后成績表,自己寫咯這里只寫了一部分數據

image

大家根據自己數據庫里的外鍵來填寫啊

 

本來還以為要給Score寫擴展屬性的,結果發現已經寫好了,那么我們就省了給Score寫擴展屬性Subject和Student了.直接開始復雜查詢吧~

這里只是做復雜查詢的演示,所以~~~我就偷懶,界面就粗糙點拉..

先到Score.My.cs里寫一段排序代碼

image

        #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,里面有個列叫Scoreimage

不支持比較...為什么呢...看一下源碼吧

 

image

罪魁禍首就在這里...咱們又踩坑了..這個坑埋的不小...還記得第一節我們踩的坑嗎,

數據庫建立了個表叫Score,里面有個屬性也叫Score,然后和class沖突了,

我們把這個屬性改成了MyScore,當時沒出問題,時隔這么久,終於碰到坑了.

 

這里邏輯有點繞,GetItemType(name) 這個name就是我們傳進去的"Score",或者是_.Score其實也是取到到的"Score"

本來是沒什么問題,但是我們偏偏把Score改成了MyScore,

 

結果就造成了這里GetItemType取到不到值,所以~~~~就報錯拉...所以把這里改成MyScore就可以了

image

可以看到這里2個框被修改過了,都怪我表沒建好...

 

本來上面那個圈里寫的是._.Score.Desc()結果它取到的值是"MyScore Desc"

 

於是組出來的sql就是 select * from score order by myscore desc,結果可想而知...

 

學會調試也是必修課啊~~

 

好了...我們開始前台吧~~~頁面布局開始

image
    <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>

然后是前台的cs
        protected 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();
        }
image最后運行效果就是這樣...
這里其實也沒什么好解釋的.就是綁定綁定數據.其他也沒什么了...分頁和排序..我想寫啊..可是現在這都3點了..還有2個小時要下班了,我還有一些事情沒做完呢...
所以見諒了...樓主以后有空一定補全..
 
其實本來這個例子可以不用帖的,但是既然碰到一些坑(主要是我挖的坑,還不能怪xcode),所以怕新手搞不懂怎么弄,所以特意把遇到的問題給帖出來了.
 
主要還是根據文章開頭的筆記,略加修改即可完成大部分任務.
 
 
本節demo
 

XCode上手指南系列:

NewLife.XCode 上手指南
NewLife.XCode 上手指南(二) 反向工程使用舉例
NewLife.Xcode 上手指南(三) 擴展屬性的使用

NewLife.XCode 上手指南(四) 級聯操作

 

NewLife論壇地址:

http://www.newlifex.com/

大石頭博客:

http://www.cnblogs.com/nnhy/

NewLife.XCode開發資源目錄

http://www.cnblogs.com/asxinyu/archive/2012/06/02/2532210.html


 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM