我目前的项目是使用NHibernate 3.0b1和NHibernate.Linq.Query<T>()
API。我在LINQ中很流利,但我对HQL或ICriteria API完全没有经验。我的一个查询不支持IQueryable API,所以我认为我需要使用以前的API之一 - 但我不知道从哪里开始。如何使用NHibernate ICriteria API表示这个LINQ查询?
我试过在网络上搜索ICriteria的一个很好的入门指南,但是我发现的唯一例子要么太简单化以至于无法在这里应用,要么我的理解太过先进。如果有人有一些很好的学习材料传递,将不胜感激。
在任何情况下,对象模型,我询问对这个样子的(大大简化,不相关的特性省略):
class Ticket {
IEnumerable<TicketAction> Actions { get; set; }
}
abstract class TicketAction {
Person TakenBy { get; set; }
DateTime Timestamp { get; set; }
}
class CreateAction : TicketAction {}
class Person {
string Name { get; set; }
}
一个Ticket
有TicketAction
集合描述它的历史。 TicketAction
亚型包括CreateAction
,ReassignAction
,CloseAction
等。所有门票在创建时都会将CreateAction
添加到此集合中。
此LINQ查询正在搜索具有给定名称的人创建的票据。
var createdByName = "john".ToUpper();
var tickets = _session.Query<Ticket>()
.Where(t => t.Actions
.OfType<CreateAction>()
.Any(a => a.TakenBy.Name.ToUpper().Contains(createdByName));
的OfType<T>()
方法使NotSupportedException
被抛出。我可以使用ICriteria来代替吗?
我宁愿没有到反向引用添加到'TicketAction'的'Ticket'如果我可以帮助它,因为这会引入其他问题,但谢谢你的提示。 :) – 2010-11-01 14:32:22
我们处理这种情况的另一种方式是实际在字符串生成器中创建HQL。我们尝试使用Linq到Nhibernate表达式,但是当集合位于对象一侧时,它们也不支持集合。不幸的是,“包含”方法不能通过Linq转换为nHibernate。 – Josh 2010-11-01 16:48:08
毕竟我的建议是(在TicketAction上添加对Ticket的引用),但最终出现错误:“NHibernate.QueryException:无法解析属性:TakenBy。名称:CreateAction“ – 2010-11-01 21:13:47