1)  DetachedCriteria
    ICriteria query = this.Session.CreateCriteria(typeof(Person));    
    DetachedCriteria personIds = DetachedCriteria.For(typeof(ServicePerson))
        .SetProjection(Projections.Property("PersonId"))
        .Add(Restrictions.Eq("IsPrincipal", true));
    query.Add(Subqueries.PropertyIn("ID", personIds));

===> 生成的sql:
    SELECT count(*) as y0_
    FROM   Person p
    WHERE  p.Id in (
        SELECT ps.PersonId as y0_
        FROM   Service_Person ps
        WHERE  ps.IsPrincipal = 1
    )


2) CreateCriteria 会产生 inner join哦 ^_^
    ICriteria query = this.Session.CreateCriteria(typeof(Person));
    query.CreateCriteria("PersonServices", "sp").Add(Expression.Eq("sp.IsPrincipal", true));

===> 生成的sql:
   SELECT count(*)
    FROM   Person p
    inner join Service_Person sp on p.Id = sp.PersonId
    WHERE  sp.IsPrincipal = 1

3)

 

  <!-- psOTCOrderGetHistory return OrderId [] -->
    <sql-query name="psOTCOrderGetHistory">

        <![CDATA[     
        exec dbo.ps_OTCOrder_GetHistory        :EstId, :IsGrouped
        ]]>

    </sql-query>

      List<long> OrderIds = new List<long>();
                IQuery query = this.Session.GetNamedQuery("psOTCOrderGetHistory");
                query.SetParameter("EstId", id);
                query.SetParameter("IsGrouped", isGrouped);
                OrderIds = query.List<long>().ToList<long>();
                
                ICriteria criteria = this.Session.CreateCriteria<OTCOrder>()
                    .Add(Expression.In("ID",OrderIds));
                list = criteria.List<OTCOrder>().ToList<OTCOrder>();
                return list;

posted on 2011-10-14 21:01  鱼不爱水  阅读(193)  评论(0)    收藏  举报