(流利)NHibernate SELECT IN

时间:2011-11-22 22:48:46

标签: linq nhibernate fluent-nhibernate

鉴于以下表格:

tool
 *toolid
 *n other fields

process
 *processid
 *n other fields

toolprocess
 *toolprocessid
 *toolid
 *processid
 *n other fields

当尝试为特定进程选择所有工具时,我在工具流程中获得了几千个选择,我的Linq看起来像这样:

from tool in tools
where toolprocesses.Any(t=>t.Tool.Id==tool.Id)
select tool

其中toolprocesses包含具有相同processid的工具进程列表

在SQL中我会写

SELECT * FROM TOOL WHERE toolid IN 
    (SELECT TOOLID FROM TOOLPROCESS WHERE processid = 'someid');

几乎没有时间,按预期工作

如何让NHibernate创建此查询(或类似的东西)?

2 个答案:

答案 0 :(得分:3)

我不知道您是否可以在Query中执行此操作,但您可以在QueryOver / Criteria中执行此操作。

在QueryOver中,它看起来像:

var subQuery = QueryOver.Of<Toolprocess>()
                        .Where(x => x.Process.Id == id) 
                        .Select(x => x.Tool.Id);

var result = session.QueryOver<Tool>()
                    .WithSubquery.WhereProperty(x => x.Id).In(subQuery)
                    .List();

http://www.philliphaydon.com/2010/09/28/queryover-with-nhibernate-3-lovin-it/

或者,如果你想做Exists而不是In,我在这里写了博客:

http://www.philliphaydon.com/2011/01/19/revisiting-exists-in-nhibernate-3-0-and-queryover/

答案 1 :(得分:1)

尝试

from t in Session.Query<Tool>()
join tp in Session.Query<Toolprocess>() on t equals tp.Tool
where tp.Process.Id == 'someid'
select t;

我假设您正在使用NH 3.X.这应该比Select ... Where ... In query。

更快