2

我有一个抽象基类,其中包含一个名为“DateCreated”的属性;它有许多子类,其中一些相互链接。

当我尝试查询其中一个子类时,我收到 DateCreated 的模棱两可的列错误,因为它包含在多个表中。

以下是标准的片段:

.SetProjection(Projections.ProjectionList()
.Add(Projections.GroupProperty(Item.LinkField + ".Id"), "Measure")
.Add(Projections.Count("Id"), "StatCount")
.Add(Projections.GroupProperty("lnk." + Item.LinkTextField), "MeasureText")
.Add(Projections.SqlGroupProjection("MONTH(DateCreated) As [period]", "MONTH(DateCreated)", new[] { "period" }, new IType[] { NHibernateUtil.Int32 })))

我有什么方法可以指定子类与其父类之间连接的别名作为标准的一部分吗?我认为CreateAlias不会起作用,因为没有加入属性。

  1. 如果我{alias}.给加上前缀DateCreated,它将_this在生成的 SQL 中加上前缀,虽然那是当前表的别名,但它不是包含该DateCreated字段的父表的别名,因此找不到该列。

  2. 如果我在生成的 SQL 中为 NHibernate 赋予父表的别名添加前缀,则查询有效,但我认为这可能是个坏主意this_1_.DateCreated

这是 NHibernate 生成的 SQL:

SELECT TOP (5) this_.incidenttype_id      AS y0_,
               Count(this_.module_id)     AS y1_,
               lnk1_.dicttext             AS y2_,
               Month(this_1_.datecreated) AS [StatFrequency]
FROM   tblincident this_
       INNER JOIN tblmodule this_1_
               ON this_.module_id = this_1_.id
       INNER JOIN tbldict lnk1_
               ON this_.incidenttype_id = lnk1_.id
       LEFT OUTER JOIN tbldictcode lnk1_1_
                    ON lnk1_.id = lnk1_1_.dict_id
       LEFT OUTER JOIN tbldictimage lnk1_2_
                    ON lnk1_.id = lnk1_2_.dict_id
       LEFT OUTER JOIN tbldictsdscategory lnk1_3_
                    ON lnk1_.id = lnk1_3_.dictimage_id
WHERE  this_1_.customer_id = 2
       AND this_1_.isarchive = 0
       AND this_1_.isactive = 1
       AND this_1_.isconfidential = 0
       AND this_.incidentdate BETWEEN '2012/01/01' AND '2013/04/01'
       AND this_1_.isactive = 1
       AND this_1_.customer_id = 2
       AND this_1_.orgunit_id BETWEEN 3 AND 1000
GROUP  BY this_.incidenttype_id,
          lnk1_.dicttext,
          Month(this_1_.datecreated) 

在此示例中,tblIncident 是 tblModule 的子类 DateCreated 包含在 tblModule 中。上述条件起作用的唯一原因是因为我传入了“this_1_”,因为它是由 nhibernate 自动分配给它的。使用“{alias}”会输出“this_1”,这会导致错误。

我显然想要一种方法来指定该别名。

4

0 回答 0