2015-07-21 55 views
0

我在这里遇到了一个小问题,我需要在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'. 

而且堆栈跟踪:

Hopefully you can open this image to a bigger size.

而且我想说,如果你问我复杂的事情有关NHibernate的我未必能回答最后一件事你,就像“你为什么不这样做,而不是Bla bla?”。出于上述原因,我无法明确回答。

感谢您提前阅读这篇长篇文章!

+0

计数列是否存在于您的表中,您尝试使用流畅的nhibernate进行映射? – jtabuloc

+0

@JTC不,它不。该查询告诉我们公司中每个办公室有多少个测量点。所以它创建一个名为“Count”的计数器。 –

+0

我认为你不应该试图映射这个,但只是写一个NHibernate的查询... –

回答

1

使用HQL或QueryOver创建查询。查询是基于你的类而不是表,并且缺少一些信息。我只是用我的幻想填补空白。有一个在HQL查询的纯改写,假设在你的类模型的一些属性:

SELECT count(Matpunkt.id) 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 m 
     join m.InstrumentParameter ip 
     join m.Uppdrag u 
     join u.Företag f 
    WHERE ip.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 

你得到一个object[]回来了,带着一个ORM工作时,这是不是很漂亮。

坦率地说,我想这可以简化很多。如果我有你的班级模型,我可能会想出一个更好的解决方案。从Företag的角度来看,你想要计算什么?这似乎是这里的核心部分?

您还应该考虑纯粹的面向对象的方法,在这种方法中,您将完全初始化的对象存储到内存并在那里进行一些处理(仅对少量记录执行此操作)。

+0

对象公司(瑞典语中的Företag,如果您想知道:P)具有您期望从这样的类(名称,地址,PostAddress等)中获得的属性。 CompanyViewModel具有您在我的问题中的JSON对象中看到的属性。 这个查询计算一个办公室有多少个测量点(表Matpunkt)。所以我在SQL Management Studio中得到的就是'Count'就是其中之一的所有列。所以我们的一个办公室有326个测量点,另一个只有87个。 但是您认为我需要更改sql吗?那一个已经用在那个aspx元素几年了。对困惑感到抱歉。 –

+0

当然,你也可以继续使用SQL ...通常HQL更简单,取决于类模型适合问题的程度,但有时它会让你发疯。 –

+0

我从来没有使用过HQL。在今天之前从未听说过^^你写的是在HQL中?那返回一个对象?在那个对象中,我会有我的数量? :P –