我是NHibernate的新手,我不确定我的问题是否合理。
我正在尝试重写我目前拥有的一些代码:
public IEnumerable<Order> GetByQueue(OrderStatus orderStatus, Queue queue)
{
var criteria = NHibernateSession.CreateCriteria(typeof (TaskDevice), "TaskDevice");
//Pull up all Tasks where a Task's TaskDevice's SourceSiteID or DestinationSiteID are represented in a Queue's QueueLocations.
foreach(QueueLocation queueLocation in queue.QueueLocations)
{
criteria.Add(
Expression.Disjunction()
.Add(Restrictions.Eq("OriginalLocationID", queueLocation.ComponentID))
.Add(Restrictions.Eq("LocationID", queueLocation.ComponentID))
);
}
//Get a hold on all the Tasks returned from TaskDevices.
List<Task> tasks = criteria.List<TaskDevice>().Select(taskDevice => taskDevice.Task).ToList();
//Return all Orders of the given Tasks whose OrderStatus matched the provided orderStatus.
return tasks.Where(task => task.Order.OrderStatus == orderStatus).Select(task => task.Order);
}
此代码目前依赖于Queue对象。我想更改此代码,以便提供queueID而不是Queue对象。表QueueLocation包含其列之一的“QueueID”。
这意味着我现在需要与我的数据库中的另一个表QueueLocation进行交互,加载QueueID,其QueueID与提供的QueueID相匹配,然后模拟添加限制而不迭代Queue对象。
任务不知道队列和队列不知道任务。它们与Queue可能包含QueueLocation这一事实有关,该QueueLocation的ComponentID与Task的OriginalLocationID或LocationID匹配。
如果我将初始标准声明更改为:
var criteria = NHibernateSession
.CreateCriteria(typeof (TaskDevice), "TaskDevice")
.CreateCriteria("QueueLocation", "QueueLocation");
然后生成一个异常,指示NHibernate在TaskDevice上找不到属性QueueLocation。这是一个有效的异常 - TaskDevice不知道QueueLocation。
我想知道如何使用NHibernate加载两个不相关的表,这样我可以在一个查询中通过NHibernate完全过滤我的限制。这可能吗?
答案 0 :(得分:1)
对于使用模型中不相关的实体的查询,条件不是一个很好的API。
改用HQL。