在NHibernate中,如何组合两个DetachedCriteria实例

时间:2010-04-12 13:46:50

标签: c# .net nhibernate detachedcriteria

我的场景是这样的:我有一个基本的NHibernate查询来运行表单(我使用DetachedCriteria编写它,但是使用SQL语法在这里描述):

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key

显示此联接结果的用户界面允许用户指定其他条件:说:

I.SomeField = 'UserValue'.

现在,我需要最终加载命令:

SELECT * FROM Items I INNER JOIN SubItems S on S.FK = I.Key
WHERE I.SomeField = 'UserValue'

我的问题是:我使用查询的“静态”方面(顶部连接)创建了一个DetachedCriteria,并且UI使用查询的“动态”组件创建了一个DetachedCriteria。我需要将这两者组合成一个我可以在NHibernate会话上执行的最终查询。

DefaultCriteria.Add()采用ICriterion(使用Expression类创建,也许还有其他类我不知道哪个类可以解决我的问题)。

有谁知道我怎么做我想要的?

1 个答案:

答案 0 :(得分:1)

您可以使用GetExecutableCriteria将分离的条件转换为特定会话的可执行表单:

var query = DetachedCriteria.For<...>();

using (var session = ...)
using (var transaction = session.BeginTransaction())
{
    query.GetExecutableCriteria(session)
    transaction.Commit();
}

但是,我觉得你的设计有点瑕疵。用户界面应该补充标准,而不是创建自己的标准。在最坏的情况下,它应该生成ICriterion,然后在执行之前将其添加到您的条件中。最好的情况是,您可以将过滤功能抽象为完全独立于ORM技术的层,然后将UI中的过滤器应用于基础标准。