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オブジェクトに依存しています。Queueオブジェクトの代わりにqueueIDが提供されるように、このコードを変更したいと思います。テーブルQueueLocationには、その列の1つに「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を認識していません。

1つのクエリでNHibernateを介して制限を完全にフィルタリングできるように、NHibernateを使用して2つの無関係なテーブルをロードする方法を考えています。これは可能ですか?

4

1 に答える 1

1

基準は、モデルに関連していないエンティティを含むクエリに適したAPIではありません。

代わりにHQLを使用してください。

于 2012-09-11T01:04:52.797 に答える