我在閱讀關於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>();
這不會創建一個有效的查詢(我有一個分析器檢查的話),但它似乎有填充我的泛型列表的問題。它給了我錯誤「The value \」System.Object [] \「不是\」oms_dal.Models.Incident \「的類型,並且不能在此泛型集合中使用。\ r \ nParameter name:value」。然而,如果我不使用投影,但是它會選擇50個我不想要的字段,所有工作都很好。這是否意味着我在這種情況下被迫使用DTO?
關於你的最後一個例子,我不斷收到錯誤「The value \」System.Object [] \「不是\」oms_dal.Models.Incident \「的類型,並且不能在這個泛型集合中使用。\ r \ nParameter名稱:值「當我設置投影。請看我更新的答案。 – Mike 2010-08-10 13:53:29
是的,如果您設置投影,您必須使用DTO。投影不用於控制域對象中屬性的加載。它們用於將數據投影到DTO中以進行顯示。 – dotjoe 2010-08-10 14:10:08
謝謝! Waayy現在更清楚了。 :) – Mike 2010-08-10 14:47:26