zoukankan      html  css  js  c++  java
  • 查询实例NHibernate说探——Criteria条件查询

    每日一贴,今天的内容关键字为查询实例

        条件查询

        NHibernate.ICriteria接口表现特定持久类的一个查询。ISession是 ICriteria实例的工厂。

        这里以Northwind数据库为示例数据库

        示例数据表:Employees

        当初只用雇员表中部分字段。

        持久类如下:

        public class Employees

        {

            public virtual int EmployeeID { get; set; }

            public virtual string LastName { get; set; }

            public virtual string FirstName { get; set; }

            public virtual DateTime BirthDate { get; set; }

            public virtual string Address { get; set; }

            public virtual string City { get; set; }

            public virtual string PostalCode { get; set; }

        }

        映射文件如下:

        <?xmlversion="1.0"encoding="utf-8" ?>

        <hibernate-mappingxmlns="urn:nhibernate-mapping-2.2"assembly="Domain"namespace="Domain.Entities">

          <classname="Employees"table="Employees">

            <idname="EmployeeID"column="EmployeeID">

              <generatorclass="identity"></generator>

            </id>

            <propertyname="LastName"column="LastName"type="String"></property>

            <propertyname="FirstName"column="FirstName"type="String"></property>

            <propertyname="BirthDate"column="BirthDate"type="DateTime"></property>

            <propertyname="Address"column="Address"type="String"></property>

            <propertyname="City"column="City"type="String"></property>

            <propertyname="PostalCode"column="PostalCode"type="String"></property>

          </class>

        </hibernate-mapping>

        开始

        (一) 返回所有实例(返回所有雇员)

        这里返回的所有实例,且是全体的属性(字段)

        ICriteria crt = _session.CreateCriteria(typeof(Employees));           

        每日一道理
    水仙亭亭玉立,兰花典雅幽香,牡丹雍容华贵,梨花洁白无暇……美丽的花朵总能得到世人的羡慕与赞叹,殊不知,它从一粒小小的种子到最后开花,要历经无数的艰辛与坎坷!我们的成长也是如此。只有做辛勤的“织梦者”,我们的梦想才会成真!

        return crt.List<Employees>();

        Isession创立条件查询实例有4个构造方法。

        (二)  返回部分实例(返回2个雇员)

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

            crt.SetMaxResults(2);

        return crt.List<Employees>();

        (三)条件查询的约束条件

        (1)Expression

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

            crt.Add(Expression.Eq("City","London"));

            return crt.List<Employees>();

           查询内容为:雇员的都会是在伦敦的。其中Expression的名字空间为:NHibernate.Criterion

        Expression类 定义了获得某些内置ICriterion类型的工厂方法,这里用到了等于

        (2)Restrictions

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

            crt.Add(Restrictions.Eq("City", "London"));

        return crt.List<Employees>();

        查询内容为:雇员的都会是在伦敦的。其中Restrictions的名字空间为:NHibernate.Criterion

        (3)通过实例来查询

        Employees ee = new Employees { City = "London", BirthDate = Convert.ToDateTime("1955-03-04 00:00:00.000") };

             ICriteria crt = _session.CreateCriteria(typeof(Employees));

             crt.Add(Example.Create(ee));

         return crt.List<Employees>();

        查询伦敦的,诞辰在那个时间的。(为什么这里我要加个诞辰上去?因为我的持久类中有这个属性,如果在实例查询中不给定这个值,会有日期越界的异常。在下边的例子中,来处理这种情况)这是制约的相称的实现。下边实现一个相似的例子:

        Employees ee = new Employees { FirstName = "a"};

        Example exp=Example.Create(ee)

                    .EnableLike(MatchMode.Start)

                    .ExcludeProperty("BirthDate")

                    .IgnoreCase();

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.Add(exp);

        return crt.List<Employees>();

        这个例子中,指定相似的姓名等a,看实例exp:

        ·采取相似比拟EnableLike

        ·相似比拟匹配模式MatchMode.Start,开头匹配,这个应该类似于SQL中的a%

        ·消除比拟属性ExcludeProperty,这个方法就是用于处理消除的。上个例子中日期没给,所以会出现异常,而这个方法则消除了这种异常产生(其实就是消除不比拟的属性(字段))。

        ·忽略大小写

        (四)排序

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

        crt.AddOrder(new NHibernate.Criterion.Order("FirstName", true));

        return crt.List<Employees>();

        排序字段:名字,升序(true)

        (五)聚合

        (1)查询人数

        ICriteria crt = _session.CreateCriteria(typeof(Employees));

             crt.SetProjection(Projections.RowCount());

        return crt.List();

        NHibernate.Expression.Projections是 IProjection 的实例工厂。通过调用 SetProjection()应用投影到一个查询。

        (2)Avg

        从这个开始到以下的例子又回到以Products为示例数据表

           ICriteria crt = _session.CreateCriteria(typeof(Products));           

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.Avg("Price"))

                    );

         return crt.List();

        通过投影列表来添加投影聚合方法。

        这里获得产品的平均价格,这里没有条件约束,下边这个例子获得产品类别为2的产品的平均价格:

        ICriteria crt = _session.CreateCriteria(typeof(Products));           

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.Avg("Price")))

                    .Add(Expression.Eq("CategoryID",2));

        return crt.List();

        (3)Max(最大价格)

        ICriteria crt = _session.CreateCriteria(typeof(Products));

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.Max("Price")));

         return crt.List();

        (4)Min(最低价格)

        ICriteria crt = _session.CreateCriteria(typeof(Products));

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.Min ("Price")));

         return crt.List();

        (5)Sum(和)

        ICriteria crt = _session.CreateCriteria(typeof(Products));

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.Sum ("Price")));

         return crt.List();

        (6)分组

        ICriteria crt = _session.CreateCriteria(typeof(Products));

             crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.GroupProperty("CategoryID")));

         return crt.List<int>();

        这个分组只是返回一个属性,所以用int泛型可以了。下边的例子返回分组,并返回各组的数目

        ICriteria crt = _session.CreateCriteria(typeof(Products));

        crt.SetProjection(Projections.ProjectionList()

                    .Add(Projections.GroupProperty("CategoryID"))

                    .Add(Projections.RowCount()));

        return crt.List();

        ·这里的List为System.Collections.Ilist,且是object[]类型的

    文章结束给大家分享下程序员的一些笑话语录: 这年头的互联网真是娱乐了中国,网民们从各种各样的“门”里钻来钻去,又有好多“哥”好多“帝”,值得大家品味不已……网络经典语录,关于IT与互联网,经典与您分享!

    --------------------------------- 原创文章 By
    查询和实例
    ---------------------------------

  • 相关阅读:
    【转】mapgis的一些实用方法和处理技巧
    mac osx 升级到10.10 软件无法打开的问题
    Oracle临时表
    增加表空间大小的三种办法
    哪些情况会记录Oracle Alert日志
    每日PDCA实践
    graphite积累(二)
    Graphite在centeros 6下安装
    linux screen命令
    linux环境中执行Mysql脚本
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3111503.html
Copyright © 2011-2022 走看看