2010-08-09 18 views
4

我在閱讀關於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?

回答

5

您還需要指定投影屬性名狀...

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

,一般你不伸入同一個域中的對象。如果你想事件滿足某種條件(不是DTO),那麼就不要設置預測你應該創建一個事件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>()); 

/使用ResultTransformer 。相反,你只需做這樣的事情...

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。

+0

關於你的最後一個例子,我不斷收到錯誤「The value \」System.Object [] \「不是\」oms_dal.Models.Incident \「的類型,並且不能在這個泛型集合中使用。\ r \ nParameter名稱:值「當我設置投影。請看我更新的答案。 – Mike 2010-08-10 13:53:29

+0

是的,如果您設置投影,您必須使用DTO。投影不用於控制域對象中屬性的加載。它們用於將數據投影到DTO中以進行顯示。 – dotjoe 2010-08-10 14:10:08

+0

謝謝! Waayy現在更清楚了。 :) – Mike 2010-08-10 14:47:26

相關問題