0

我的场景是这样的:我有一个基本的 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 类创建,也许其他我不知道的类可以解决我的问题)。

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

4

1 回答 1

1

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

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

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

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

于 2010-04-12T15:18:33.957 回答