2010-04-12 39 views
0

我的情况是这样的:我有一个基地NHibernate的查询的形式来运行(我使用的DetachedCriteria编码,但使用SQL语法在这里形容它):在NHibernate的,我怎么合并两个实例的DetachedCriteria

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和查询的'dynamic'组件。我需要将这两者合并成一个可以在NHibernate会话中执行的最终查询。

DefaultCriteria.Add()需要一个ICriterion(它是使用Expression类创建的,也可能是其他类,我不知道哪个可以解决我的问题)。

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

回答

1

您可以使用GetExecutableCriteria把一个分离的标准为可执行格式特定会话:

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

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

不过,我觉得你的设计是一个小缺陷。 UI应该补充标准,而不是创建它自己的标准。最坏的情况下,它应该生成ICriterion,然后在执行前添加到您的标准。充其量,您可以将过滤功能抽象为完全独立于您的ORM技术的图层,然后将UI中的过滤器应用到您的基本标准。

+0

谢谢肯特。发布问题后我得出了同样的结论。 我已经改变了我的'UI'(其实际DTO工厂代码,不是真正的用户界面)来生成ICriterion。 关于把自己从ORM中分离出来的好处 - 我应该创建自己的标准来描述类,然后使用它们来生成合适的NHibernate标准。 – Trevor 2010-04-13 06:43:37

相关问题