• 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


     
  • 相关阅读:
    Android MVP架构分析
    JavaEE基本了解
    学习面试题Day09
    使用反射来实现简单工厂模式
    Android Material Design简单使用
    c语言 找最小值
    c++ 计算指定半径圆的面积
    c++ 字符串拷贝以及合并
    python yaml文件读写
    python 列表元素替换以及删除
  • 原文地址:https://www.cnblogs.com/JangoJing/p/2644124.html
Copyright © 2020-2023  润新知