我在这里遇到了一个小问题,我需要在NHibernate中映射count()列。 我在NHibernate上真的很糟糕,但这是我需要解决的任务。流利的NHibernate映射SQL Count()列
对不起,我将在这里发布的代码中的瑞典语,这是一个原来只有瑞典语的旧数据库。但是,真的,你只需要看第一行。但为了以防万一,我发布了全部内容。
SELECT COUNT(Matpunkt.id_matpunkt) AS [Count],
f.ID_Företag,
f.Namn,
f.Adress,
f.Postnummer,
f.Postadress,
f.Tele,
f.Orgnummer,
f.Typ,
f.Logo,
f.Fax,
f.Mallkatalog,
f.Tidszon,
u.Ansvarigtkontor AS [AnsvKontor]
FROM Matpunkt
INNER JOIN MatpunktInstrumentParameter ON Matpunkt.id_matpunkt = MatpunktInstrumentParameter.id_matpunkt
INNER JOIN Uppdrag u ON Matpunkt.id_uppdrag = u.ID_Uppdrag
INNER JOIN Företag f ON u.Ansvarigtkontor = f.ID_Företag
WHERE MatpunktInstrumentParameter.tid_ner IS NULL
GROUP BY f.ID_Företag, f.Namn, f.Adress, f.Postnummer, f.Postadress, f.Tele, f.Orgnummer, f.Typ, f.Logo, f.Fax, f.Mallkatalog, f.Tidszon, u.Ansvarigtkontor
ORDER BY [Count] desc
此外,我不知道我是否应该使用AS [Count]
或AS 'Count'
。 甚至SELECT COUNT(*)
,而不是我使用的,或者,如果我甚至需要使用别名,所有在一起...是啊,我不知道什么是在SQL中的最佳做法。说实话,我没有写这个查询。它最初在webforms asp:SqlDataSource元素中。但现在整个网站,但这一个是“升级”使用MVC和AngularJS。我的同事们正在度假,我只是在这里问你。
这里是映射类:
public CompanyMap()
{
Table("[Företag]");
Id(x => x.ID, "ID_Företag").Access.PascalCaseField(Prefix.Underscore);
Map(x => x.Name, "Namn").Not.Nullable();
Map(x => x.Address, "Adress");
Map(x => x.ZipCode, "Postnummer");
Map(x => x.PostAddress, "Postadress");
Map(x => x.PhoneNumber, "Tele");
Map(x => x.CorporateIdentityNumber, "Orgnummer");
Map(x => x.Type, "Typ");
Map(x => x.Logo, "Logo");
Map(x => x.Fax, "Fax");
References(x => x.Office, "AnsvKontor").Nullable();
Map(x => x.TemplateFolder, "Mallkatalog");
Map(x => x.TimeZone, "Tidszon").Nullable();
Map(x => x.Count, "Count");
HasMany<User>(x => x.Users).KeyColumn("ID_Företag");
}
在这里很好地混合瑞典语和英语,但你只需要看看,说Map(x => x.Count, "Count");
行。 编辑:类似于最后一行的原因是,如果您想知道为什么他们在那里并且没有被我使用过,则该类用于网站上的几个不同的事情。
仅供参考此映射在没有该行的情况下工作。但是,我只是在Count
上得到空回。
[
{
"id": 1,
"name": "dummytext - Stockholm",
"address": "dummytext 34",
"zipCode": "123 45",
"postalAddress": "Stockholm",
"phone": "123456789",
"corporateIdentityNumber": "123456-789",
"count": null
},
是啊我不想给你真实的数据......我想你会明白的。 而且因为我不擅长NHibernate和我只是添加东西给了非常大的解决方案,我不知道我是否需要添加此行的位置:
public static void Create()
{
Mapper.CreateMap<Company, CompanyViewModel>()
.ForMember(vm => vm.PostalAddress, cfg => cfg.MapFrom(c => c.PostAddress))
.ForMember(vm => vm.Phone, cfg => cfg.MapFrom(c => c.PhoneNumber))
.ForMember(vm => vm.Count, cfg => cfg.MapFrom(c => c.Count));
}
}
最后例外:
Invalid column name 'Count'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'Count'.
而且堆栈跟踪:
而且我想说,如果你问我复杂的事情有关NHibernate的我未必能回答最后一件事你,就像“你为什么不这样做,而不是Bla bla?”。出于上述原因,我无法明确回答。
感谢您提前阅读这篇长篇文章!
计数列是否存在于您的表中,您尝试使用流畅的nhibernate进行映射? – jtabuloc
@JTC不,它不。该查询告诉我们公司中每个办公室有多少个测量点。所以它创建一个名为“Count”的计数器。 –
我认为你不应该试图映射这个,但只是写一个NHibernate的查询... –