鉴于以下表格:
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创建此查询(或类似的东西)?
答案 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。
更快