我目前的项目正在使用 NHibernate 3.0b1 和NHibernate.Linq.Query<T>()
API。我非常精通 LINQ,但我完全没有使用 HQL 或 ICriteria API 的经验。IQueryable API 不支持我的一个查询,所以我认为我需要使用以前的 API 之一——但我不知道从哪里开始。
我尝试在网上搜索 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; }
}
ATicket
有一个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>()
方法导致 aNotSupportedException
被抛出。我可以使用 ICriteria 来代替吗?