Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nhibernate 如果投影为';什么是可选的?_Nhibernate_Castle Activerecord - Fatal编程技术网

Nhibernate 如果投影为';什么是可选的?

Nhibernate 如果投影为';什么是可选的?,nhibernate,castle-activerecord,Nhibernate,Castle Activerecord,我正在读关于DetachedCriteria的文章。文档清楚地显示,为投影设置别名是可选的。但是,每当我省略别名时,我的模型属性都不包含任何数据。这是我的两个测试模型 [ActiveRecord("INCIDENT")] public class Incident : ActiveRecordBase<Incident> { [PrimaryKey(PrimaryKeyType.Native, "INCIDENT_ID", ColumnType = "Int32")]

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

[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; }
}
给我的投影列表并附加

.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>();
IList results=sess.CreateCriteria(“i”)
.SetProjection(Projections.ProjectionList()项目)
.添加(项目财产(“i.IncidentId”),“IncidentId”)
.Add(Projections.Property(“i.CreationDatetime”),“CreationDatetime”)
.添加(预测、财产(“c.CauseDesc”),“CauseDesc”)
)
.Add(Expression.Gt(“i.IncidentId”,1234567))
.CreateAlias(“原因”、“c”)
.List();

这确实创建了一个有效的查询(我用探查器检查了它),但在填充我的通用列表时似乎遇到了问题。它给出了错误“值\”System.Object[]\“不是类型\“oms\u dal.Models.Incident\”并且不能在此通用集合中使用。\r\n参数名称:值”。然而,如果我不使用投影,所有的工作都很好,但是它选择了50+个我不想要的字段。这是否意味着在这种情况下我必须使用DTO?

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

.Add(Projections.Property("i.IncidentId"), "IncidentId")
此外,通常情况下,您不会投影到同一个域对象中。您应该创建一个事件数据,如

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>());
.SetProjection(Projections.ProjectionList()项目)
.添加(项目财产(“i.IncidentId”),“IncidentId”)
.Add(Projections.Property(“i.CreationDatetime”),“CreationDatetime”)
)
.SetResultTransformer(Transformers.AliasToBean());
如果希望事件符合某些条件(不是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>();
IList事件=session.CreateCriteria()
.CreateAlias(“原因”,“c”)//现在您可以通过`c'访问原因属性`
.Add(Restrictions.Eq(“c.CauseDesc”、“某些原因”))
.List();

查看根条件对象如何不需要别名。如果有帮助,我只对初始对象使用CreateCriteria。如果需要引用子对象,我将使用CreateAlias。

关于上一个示例,我不断收到错误“值\”System.Object[]\“不是类型\“oms\u dal.Models.Incident\”,因此无法在此通用集合中使用。\r\n设置投影时,参数名称:value”。请看我更新的答案。是的,如果你设置投影,你必须使用DTO。投影不用于控制域对象中属性的加载。它们用于将数据投影到DTO中进行显示。
.SetProjection(Projections.ProjectionList()
   .Add(Projections.Property("i.IncidentId"), "IncidentId")
   .Add(Projections.Property("i.CreationDatetime"), "CreationDatetime")
)
.SetResultTransformer(Transformers.AliasToBean<IncidentDTO>());
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>();