1

どちらも正常に機能する2つのクエリを作成しましたが、それらを組み合わせる方法を理解するのに本当に苦労しています。私の最大の問題は、クエリに2つの異なる構文を使用したことだと思いますが、「SQL風」のマークアップを使用せずに最初のクエリを表現する方法がわかりませんでした。

List<Task> tasksFromQueue = NHibernateSession.CreateQuery(
    "Select t from Task t, QueueLocation q where q.Queue.ID = :queueID and (t.SiteID = q.ComponentID or t.OriginalSiteID = q.ComponentID)")
    .SetParameter("queueID", queueID).List<Task>().ToList();

List<Task> tasksFromWorkflow = NHibernateSession
    .CreateCriteria(typeof(Task), "Task")
    .CreateCriteria("Task.Order", "Order")
    .CreateAlias("Task.TaskDevice", "TaskDevice").List<Task>();

IEnumerable<Task> tasks = tasksFromWorkflow.Intersect(tasksFromQueue);

ご覧のとおり、私には2つの問題があります。

  • 最初のクエリに冗長構文を使用し、2番目のクエリにNHibernateマークアップを使用します。
  • DBを2回叩いてから、結果を交差させます。

tasksFromWorkflowクエリは、実際には上記よりもはるかに複雑です。クエリ全体を表示するには、ここをクリックしてください。追加のコードが私の問題について本当に何かを変えたかどうかはわかりませんでした。そのため、問題を説明しながら、すぐに表示されるスニペットをできるだけ短くすることにしました。

NHibernateは交差点をサポートしていないと読んだので、極端に複雑になることなく1つのクエリで達成することはおそらく不可能ですか?

4

1 に答える 1

1

これがどれほどのパフォーマンスになるかはわかりませんが、アイデアは明確でなければなりません

var tasksFromQueue = DetachedCriteria.For<Task>()
            .Add(Restrictions.Or(
                Subqueries.In("SiteID", DetachedCriteria.For<QueueLocation>().Add(Restrictions.Eq("Queue.ID", queueID)).SetProjection(Projections.Property("ComponentID"))),
                Subqueries.In("OriginalSiteID", DetachedCriteria.For<QueueLocation>().Add(Restrictions.Eq("Queue.ID", queueID)).SetProjection(Projections.Property("ComponentID")))))
            .SetProjection(Projections.Id());

    "Select t from Task t, QueueLocation q where q.Queue.ID = :queueID and (t.SiteID = q.ComponentID or t.OriginalSiteID = q.ComponentID)")
    .SetParameter("queueID", queueID).List<Task>().ToList();

var tasksFromWorkflow = DetachedCriteria.For<Task>()
    .CreateAlias("Order", "order")
    .CreateAlias("TaskDevice", "device")
    .Add(<restrictions>)
    .SetProjection(Projections.Id());

var results = NHibernateSession.CreateCriteria<Task>()
    .Add(Subqueries.In("Id", tasksFromQueue))
    .Add(Subqueries.In("Id", tasksFromWorkflow))
    .List<Task>();
于 2012-10-11T07:44:37.043 に答える