【问题标题】:Why IQueryOver has 2 type arguments?为什么 IQueryOver 有 2 个类型参数?
【发布时间】:2013-12-19 17:37:37
【问题描述】:

为什么 IQueryOver 有 2 个类型参数:

QueryOver<TRoot,TSubType> is an API for retrieving entities by composing
NHibernate.Criterion.Expression objects expressed using Lambda expression
syntax.

【问题讨论】:

    标签: c# nhibernate orm queryover


    【解决方案1】:

    答案是:支持流畅的语法,并且始终可以访问根设置。

    不太流利

    所以我们可以使用这个定义:

    IQueryOver<Contact,Contact> rootQuery = session  // here we have Contact query
        .QueryOver<Contact>();                          
    IQueryOver<Contact, Employee> emplQueryOver = rootQuery
        .JoinQueryOver<Employee>(c => c.Parnter);       // here we work with its Parnter
    IQueryOver<Contact, Employee> creatorQueryOver = emplQueryOver
        .JoinQueryOver<Employee>(e => e.Creator);       // here we have creator of Parnter
    

    有了这个,我们可以做一些过滤:

    emplQueryOver.Where(...
    creatorQueryOver.Where(...
    

    然后返回根查询并设置

    rootQuery.OrderBy(c => c.ID).Desc
        .ThenBy(c => c.LastName)
          .Asc
        .SelectList(...
        .Take(50);
    

    流利

    但是由于接口IQueryOver&lt;TRoot, TSubType&gt;beeing 一直返回,我们可以在没有中间变量的情况下做到这一点......我们可以在一个流畅的运行中做到这一点

    var list = session  // here we have Contact query
        .QueryOver<Contact>()
           .Where(... //filter contact
        // Join Parnter
        .JoinQueryOver<Employee>(c => c.Parnter)
            .Where(... //filter Partner
        // Join More
        .JoinQueryOver<Employee>(e => e.Creator)
    
        // While still having the Root in the scope we can do
        .SelectList(list => list....
        .OrderBy(c => c.ID)
          .Desc
        .ThenBy(c => c.Code)
          .Asc
        .Take(50)
        .Skip(50)
        .List<Contact>(); // the Root
    

    【讨论】:

      猜你喜欢
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-05-04
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多