我有两个模型:Thing和ThingStatus。事有Id和其他一些领域。 ThingStatus是一个模型,它存储对应于Thing的id的状态枚举。现在我想要获取具有状态的东西!=已完成。 我现在尝试做的事情如下:
var unfinishedIds = session.QueryOver<ThingStatus>()
.Where(t => t.Status != StatusEnum.Completed)
.Select(t => t.Id)
.List<long>()
.ToArray();
var unfinishedThings = session.QueryOver<Thing>()
.WhereRestriction(t => t.Id)
.IsIn(unfinishedIds)
.List<Thing>();
据我了解,在这种情况下,unfinishedIds将从数据库中获取,并且仅在用作unfinishedThings查询中的过滤器之后。有没有办法避免这种情况,并让查询优化器选择正确的方法来做到这一点?我听说有一些nhibernate的期货,但我不确定他们在这里有什么帮助。
答案 0 :(得分:4)
如果您无法在两个实体之间创建NHibernate关系,则可以使用子查询。没有关系 - &gt;没有JoinAlias
(或JoinQueryOver
)可能。
使用子查询:
var unfinishedIds = QueryOver.Of<ThingStatus>()
.Where(t => t.Status != StatusEnum.Completed)
.Select(t => t.Id);
var unfinishedThings = session.QueryOver<Thing>()
.WithSubquery.WhereProperty(t => t.Id).In(unfinishedIds)
.List<Thing>();
(注意使用QueryOver.Of<>
)
该查询等同于写作:
SELECT * FROM Things WHERE Id IN (SELECT Id FROM ThingsStatuses WHERE Status <> 'Completed')