【问题标题】:(Fluent)NHibernate SELECT IN(Fluent)NHibernate SELECT IN
【发布时间】:2017-11-09 02:44:01
【问题描述】:

给定以下表格:

tool
 *toolid
 *n other fields

process
 *processid
 *n other fields

toolprocess
 *toolprocessid
 *toolid
 *processid
 *n other fields

当尝试为特定流程选择所有工具时,我在 toolprocess 上获得了数千个选择,其中我的 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 创建这个查询(或类似的东西)?

【问题讨论】:

  • 你会满足于使用 QueryOver 的 Exists 吗?

标签: linq nhibernate fluent-nhibernate


【解决方案1】:

我不知道你是否可以在 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/

【讨论】:

  • 谢谢,当我使用这个时,我在 WithSubQuery 上得到一个无法解析符号错误。我是否需要引用通过使用 NuGet 安装 NHibernate 3.1.4 无法获得的内容?
  • @Alexander - 抱歉,这是 WithSubquery,没有大写 Q。
  • 是的,这也可以。我更喜欢 .Exists 而不是 .In,因为它的性能更高。关于读取,不使用 Exists 或 In 总是更好。至少在您使用 SQL Server 时。
  • 再次感谢您的澄清。
【解决方案2】:

试试

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 查询更快。

【讨论】:

  • 感谢您的回复,这首先会导致对 where 的模棱两可的调用。当我将它转换为此方法链 _session.Query().Where(t => toolProcesses.Contains(t)) 时,我收到错误“无法从使用中推断出类型”,因为它需要一个 ToolProcess一个工具
猜你喜欢
  • 2011-04-10
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2011-02-27
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 2010-11-17
相关资源
最近更新 更多