gpt4 book ai didi

nhibernate - 如何在nhibernate查询中选择引用的实体

转载 作者:行者123 更新时间:2023-12-02 23:23:26 25 4
gpt4 key购买 nike

我有一个实体,其属性引用其他实体(示例中的 ReferenceEntity)。

使用 HQL 我可以做到这一点:

select e.ReferenceEntity from Entity e where e.Id = :entityId

NHibernate 会给我 ReferenceEntity 实例,而不需要惰性。

通过我尝试这样做的查询:

Session.QueryOver<Entity>()
.Where(e => e.Id == entityId)
.Select(e => e.ReferenceEntity)
.SingleOrDefault<ReferenceEntity>()

使用 QueryOver Nhibernate 为我提供了 ReferenceEntity,但很懒。

我想像使用 hql 一样使用 queryover 来通过急切加载来获取 ReferenceEntity。

谢谢

最佳答案

建议#1

执行查询后,您可以执行一些 LINQ 操作来获取所需的数据。

var result = Session.QueryOver<Entity>()
.Where(e => e.Id == entityId) // Filter,
.Fetch(e => e.ReferenceEntity).Eager // join the desired data into the query,
.List() // execute database query,
.Select(e => e.ReferenceEntity) // then grab the desired data in-memory with LINQ.
.SingleOrDefault();
Console.WriteLine("Name = " + result.Name);

这很简单,并且可以完成工作。

在我的测试中,它产生了一个查询。这是输出:

SELECT
this_.Id as Id0_1_, this_.Name as Name0_1_, this_.ReferenceEntity_id as Referenc3_0_1_,
q5379349_r2_.Id as Id1_0_, q5379349_r2_.Name as Name1_0_
FROM
[Entity] this_
left outer join [ReferenceEntity] q5379349_r2_
on this_.ReferenceEntity_id=q5379349_r2_.Id
WHERE this_.Id = @p0;

建议#2

另一种方法是使用 EXISTS 子查询,这会稍微复杂一些,但第一次会返回正确的结果,而不需要任何数据库后操作:

ReferenceEntity alias = null;
var result = Session.QueryOver(() => alias)
.WithSubquery.WhereExists(QueryOver.Of<Entity>()
.Where(e => e.Id == entityId) // Filtered,
.Where(e => e.ReferenceEntity.Id == alias.Id) // correlated,
.Select(e => e.Id)) // and projected (EXISTS requires a projection).
.SingleOrDefault();
Console.WriteLine("Name = " + result.Name);

经过测试 - 单个查询的结果:

SELECT this_.Id as Id1_0_, this_.Name as Name1_0_
FROM [ReferenceEntity] this_
WHERE exists (
SELECT this_0_.Id as y0_
FROM [Entity] this_0_
WHERE this_0_.Id = @p0 and this_0_.ReferenceEntity_id = this_.Id);

关于nhibernate - 如何在nhibernate查询中选择引用的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5379349/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com