c# - 为什么 IQueryOver 有 2 个类型参数?

标签 c# nhibernate orm queryover

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

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

最佳答案

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

不太流利

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

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);

流利

但是因为接口(interface)IQueryOver<TRoot, TSubType> 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

关于c# - 为什么 IQueryOver 有 2 个类型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20688206/

相关文章:

java - 在大型事务中安全清除 Hibernate session

python - Flask SQLAlchemy 关联表 : error creating backref

sql - 预加载与连接获取相同吗?

c# - AutoMapper 5.2.0 VIewModel 到 Core MVC 中的模型问题

c# - 通过 .NET/C# 发送传真

c# - 针对慢速分组的 LINQ 查询优化

mysql - 使用流畅的 NHibernate 创建继承时出现问题

c# - 使用空数据验证 IPN

asp.net - nHibernate 使用 Log4Net 进行日志记录,线程 session 问题

c# - 'NHibernate.Spatial.Type.GeometryType' 处理的“GeoAPI.Geometries.IGeometry”不可序列化