Bra*_*bby 5 nhibernate linq-to-nhibernate nhibernate-criteria
我目前的项目是使用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; }
}
Run Code Online (Sandbox Code Playgroud)
A 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));
Run Code Online (Sandbox Code Playgroud)
该OfType<T>()方法导致NotSupportedException抛出.我可以使用ICriteria代替吗?
尝试这样的事情。它是未编译的,但只要IEnumerable<TicketAction> Actions和Person TakenBy不为空,它就应该可以工作。如果您在票证构造函数中将其设置为空列表,则可以解决空值问题。
如果您在 TicketAction 中添加对 Ticket 对象的引用,您可以执行如下操作:
ICriteria criteria = _session.CreateCriteria(typeof(CreateAction))
.Add(Expression.Eq("TakenBy.Name", createdByName));
var actions = criteria.List<CreateAction>();
var results = from a in criteria.List<>()
select a.Ticket;
Run Code Online (Sandbox Code Playgroud)
根据我的经验,当列表位于对象端时,nhibernate 在标准方面遇到麻烦 - 就像你的情况一样。当输入端是值列表时,可以使用Expression.Eq。我总是必须通过 linq 找到解决此限制的方法,我会尽可能地过滤出初始结果集,然后使用 linq 再次过滤以获得我需要的内容。
| 归档时间: |
|
| 查看次数: |
569 次 |
| 最近记录: |