Fluent NHibernate map sql Count() 列

Fluent NHibernate map sql Count() column

我在这里遇到了一个小问题,我需要在 NHibernate 中映射一个 count() 列。 我真的很不擅长 NHibernate,但这是我需要解决的任务。

抱歉,我将在此处 post 代码中使用瑞典语,这是一个最初只有瑞典语的旧数据库。但实际上,您只需要查看第一行。不过我post整件事以防万一

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 元素中。但是现在整个网站只有这个 "upgraded" 使用 MVC 和 AngularJS。同事放假才来问你

这是映射 class:

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"); 的那一行。 编辑: 像最后一行这样的行的原因是这个 class 用于网站上的几个不同的东西,如果你想知道为什么它们在那里而不被使用我.

仅供参考,此映射在没有该行的情况下有效。但是后来我在 Count.

上得到了 null
[
  {
    "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 的复杂问题,我可能无法回答你,比如 "Why aren't you doing this instead, bla bla?"。由于上述原因,我显然无法回答这个问题。

感谢您提前抽空阅读这篇长文post!

使用 HQL 或 QueryOver 创建查询。该查询基于您的 classes,而不是表格,并且缺少一些信息。我只是用我的幻想来填补空白。假设您的 class 模型中有一些属性:

    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 时不是很好。

坦率地说,我想它可以简化很多。如果我有您的 class 模型,我可能会想出更好的解决方案。从 Företag 的角度来看,你到底想数什么,这似乎是这里的中心部分?

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