我的场景是这样的:我有一个基本的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类创建,也许还有其他类我不知道哪个类可以解决我的问题)。
有谁知道我怎么做我想要的?
答案 0 :(得分:1)
您可以使用GetExecutableCriteria
将分离的条件转换为特定会话的可执行表单:
var query = DetachedCriteria.For<...>();
using (var session = ...)
using (var transaction = session.BeginTransaction())
{
query.GetExecutableCriteria(session)
transaction.Commit();
}
但是,我觉得你的设计有点瑕疵。用户界面应该补充标准,而不是创建自己的标准。在最坏的情况下,它应该生成ICriterion
,然后在执行之前将其添加到您的条件中。最好的情况是,您可以将过滤功能抽象为完全独立于ORM技术的层,然后将UI中的过滤器应用于基础标准。