gpt4 book ai didi

.net - NHibernate:SQL 查询结果映射

转载 作者:行者123 更新时间:2023-12-02 06:20:21 24 4
gpt4 key购买 nike

我在 NHibernate 3.1.0.4000 中的 SQL 查询结果有问题(我使用的是 MS SQL Server 2005 数据库)。我有两张 table :AdvertsInvestments ,映射到实体:AdvertInvestment . AdvertsInvestments 相关联来自 InvestmentId列(和外键)。

为了保存我的查询结果,我创建了以下内部类:

    class InvestmentWithAdvertsCount
{
public Investment inv { get; set; }

public int cnt { get; set; }
}

查询如下:
var investementsWithAdvertCounts = _session.CreateSQLQuery(
"select {inv.*}, (select count(1) from Adverts where InvestmentId = inv.Id) cnt from Investments inv")
.AddScalar("cnt", NHibernateUtil.Int32)
.AddEntity("inv", typeof(Investment))
.SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(InvestmentWithAdvertsCount)))
.List<InvestmentWithAdvertsCount>();

当我运行这个查询时,我收到了 InvestmentWithAdvertsCount 的集合。具有正确填充的实例 cnt属性(property),但 inv属性设置为 null .我花了一些时间深入研究 NHibernate 源代码,似乎 inv 别名不知何故从查询中丢失了,NHibernate 甚至没有尝试填充 inv属性(property)。如果我删除 .SetResultTransformer我收到一个数组列表(类型为 object[2]),其中第一个元素设置为 Investment实体和第二个元素设置为其相应的广告计数。您能告诉我如何更改此查询以生成 InvestmentWithAdvertsCount正确填写?或者也许有一种方法可以将此查询重写为 QueryOver、Criteria 或 HQL(保持生成的 SQL 代码高效)?

对于这个问题的任何帮助,我都会非常感激。谢谢

最佳答案

这是一种干净的方法,使用非常简单的 LINQ to objects 处理结果:

session.CreateSQLQuery(
"select {inv.*}, (select count(1) ... inv")
.AddScalar("cnt", NHibernateUtil.Int32)
.AddEntity("inv", typeof(Investment))
.List<object[]>()
.Select(x => new InvestmentWithAdvertsCount {inv = x[0], cnt = x[1]})
.ToList();

关于.net - NHibernate:SQL 查询结果映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11860437/

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