【问题标题】:Struggling to combine two NHibernate queries in which I intersect the results努力组合两个 NHibernate 查询,其中我与结果相交
【发布时间】:2012-10-10 21:42:37
【问题描述】:

我制作了两个都可以正常工作的查询,但我真的很难理解如何组合它们。我认为我最大的问题是我对查询使用了两种不同的语法,但我不确定如何在不使用“SQL-esque”标记的情况下表达我的第一个查询。

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);

如您所见,我有两个问题:

  • 对第一个查询使用详细语法,对第二个查询使用 NHibernate 标记。
  • 两次命中 DB,然后将结果相交。

tasksFromWorkflow 查询实际上比上面看到的要复杂得多。如果您想查看整个查询 click here. 我不确定额外的代码是否真的改变了我的问题——所以我决定在解释问题的同时尽可能缩短立即显示的 sn-p .

我读到了 NHibernate doesn't support intersection,所以也许不可能在一个查询中实现而不变得非常复杂?

【问题讨论】:

    标签: c# sql nhibernate


    【解决方案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>();
    

    【讨论】:

    • 我清理了 tasksFromQueue 的分离条件的代码,但是当我尝试运行它时它出错了。这显然不是我原来的 tasksFromQueue 查询的直接翻译。今天晚些时候我会试着玩一下。
    • 如果查询运行,您可以发布查询吗?我敢肯定会有其他人有像你这样的用例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多