gpt4 book ai didi

nhibernate - 如果它是可选的,为什么我需要为我的投影设置别名?

转载 作者:行者123 更新时间:2023-12-04 01:54:55 27 4
gpt4 key购买 nike

我正在阅读有关 DetachedCriteria 的 documentation。该文档清楚地表明,为您的投影设置别名是可选的。但是,每当我省略别名时,我的模型属性都不包含任何数据。这是我的两个测试模型。

[ActiveRecord("INCIDENT")]
public class Incident : ActiveRecordBase<Incident>
{
[PrimaryKey(PrimaryKeyType.Native, "INCIDENT_ID", ColumnType = "Int32")]
public virtual int IncidentId { get; set; }

[Property("CREATION_DATETIME", ColumnType = "DateTime")]
public virtual DateTime? CreationDatetime { get; set; }

[BelongsTo("CAUSE_CD")]
public virtual Cause Cause { get; set; }
}

[ActiveRecord("CAUSE")]
public class Cause : ActiveRecordBase<Cause>
{
[PrimaryKey(PrimaryKeyType.Native, "CAUSE_CD", ColumnType = "String")]
public virtual string CauseCd { get; set; }

[Property("CAUSE_DESC", ColumnType = "String", NotNull = true)]
public virtual string CauseDesc { get; set; }
}

这是我用来查询数据库的内容。
DetachedCriteria incidentCriteria = DetachedCriteria.For<Incident>("i")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("i.IncidentId"))
.Add(Projections.Property("i.CreationDatetime"))
)
.SetResultTransformer(Transformers.AliasToBean<Incident>());
IList<Incident> incidents = Incident.FindAll(incidentCriteria);

除非我设置别名,否则两个投影属性都不会填充。所以我的问题是,为什么别名是可选的?我确定我只是缺少其他东西。但是,如果我输入一个随机别名(例如 abc),它将返回一个错误,指出它在事件类中找不到属性“abc”。公平地说,我添加了适当的别名来匹配我的属性名称。瞧!我的属性现在正在填充。

现在是我想查询查找表的问题。我加
.Add(Projections.Property("c.CauseDesc"), "CauseDesc")

到我的 ProjectionList 并附加
.CreateCriteria("i.Cause", "c")

但现在它提示它无法从我的事件模型中找到“CauseDesc”。

我在这整个标准的考验中遗漏了什么?

更新:
以下代码
IList<Incident> results = sess.CreateCriteria<Incident>("i")
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("i.IncidentId"), "IncidentId")
.Add(Projections.Property("i.CreationDatetime"), "CreationDatetime")
.Add(Projections.Property("c.CauseDesc"), "CauseDesc")
)
.Add(Expression.Gt("i.IncidentId", 1234567))
.CreateAlias("Cause", "c")
.List<Incident>();

这确实创建了一个有效的查询(我用分析器检查了它),但它似乎在填充我的通用列表时遇到了问题。它给了我错误“值\"System.Object[]\"不是\"oms_dal.Models.Incident\"类型,不能在此泛型集合中使用。\r\n参数名称:值”。但是,如果我不使用投影,则一切正常,但它会选择 50 多个我不想要的字段。这是否意味着在这种情况下我不得不使用 DTO?

最佳答案

您需要指定投影属性名称,例如...

.Add(Projections.Property("i.IncidentId"), "IncidentId")

此外,通常您不会转换到同一个域对象中。您应该创建一个事件 dto 喜欢...
public class IncidentDTO  
{
public int IncidentID { get; set; }
public DateTime CreationDatetime { get; set; }
}

进而...
.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("i.IncidentId"), "IncidentId")
.Add(Projections.Property("i.CreationDatetime"), "CreationDatetime")
)
.SetResultTransformer(Transformers.AliasToBean<IncidentDTO>());

如果您希望事件匹配某些标准(不是 DTO),则不要设置投影/结果转换器。相反,你只是做这样的事情......
IList<Incident> incidents = session.CreateCriteria<Incident>()
.CreateAlias("Cause", "c") //now you can access Cause properties via `c.`
.Add(Restrictions.Eq("c.CauseDesc", "some cause"))
.List<Incident>();

了解根标准对象如何不需要别名。如果有帮助,我只将 CreateCriteria 用于初始对象。如果我需要引用子对象,我使用 CreateAlias。

关于nhibernate - 如果它是可选的,为什么我需要为我的投影设置别名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3442127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com