2015-07-21 164 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 –