0

我是 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 的 QueueLocation,然后在不迭代 Queue 对象的情况下模拟添加限制。

任务不知道队列,队列不知道任务。它们与队列可能包含其 ComponentID 与任务的 OriginalLocationID 或 LocationID 匹配的 QueueLocation 的事实相关。

如果我将初始标准声明更改为:

var criteria = NHibernateSession
    .CreateCriteria(typeof (TaskDevice), "TaskDevice")
    .CreateCriteria("QueueLocation", "QueueLocation");

然后生成一个异常指示 NHibernate 在 TaskDevice 上找不到属性 QueueLocation。这是一个有效的例外——TaskDevice 不知道 QueueLocation。

我想知道如何使用 NHibernate 加载两个不相关的表,以便我可以在一个查询中通过 NHibernate 完全过滤我的限制。这可能吗?

4

1 回答 1

1

对于与模型中不相关的实体的查询,Criteria 不是一个好的 API。

请改用 HQL。

于 2012-09-11T01:04:52.797 回答