【问题标题】: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<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