NHibernate - 在哪里..在..和未来
NHibernate - where .. in .. and future
我有两个模型:Thing 和 ThingStatus。 Thing 有一个 Id 和一些其他字段。 ThingStatus 是一个模型,它存储与 Thing 的 id 对应的 Status 枚举。现在我想获取 Status != Completed 的东西。
我现在尝试做的是这样的:
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 查询中的过滤器。有什么办法可以避免这种情况并让查询优化器 select 以正确的方式做到这一点?我听说 nhibernate 有一些 futures 可用,但我不确定他们在这里有什么帮助。
如果不能在两个实体之间创建 NHibernate 关系,则可以使用子查询。没有关系 --> 没有 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')
我有两个模型:Thing 和 ThingStatus。 Thing 有一个 Id 和一些其他字段。 ThingStatus 是一个模型,它存储与 Thing 的 id 对应的 Status 枚举。现在我想获取 Status != Completed 的东西。 我现在尝试做的是这样的:
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 查询中的过滤器。有什么办法可以避免这种情况并让查询优化器 select 以正确的方式做到这一点?我听说 nhibernate 有一些 futures 可用,但我不确定他们在这里有什么帮助。
如果不能在两个实体之间创建 NHibernate 关系,则可以使用子查询。没有关系 --> 没有 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')