NHibernate - 在...和...的未来

时间:2016-02-10 14:02:07

标签: c# sql nhibernate future queryover

我有两个模型: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的期货,但我不确定他们在这里有什么帮助。

1 个答案:

答案 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')