2011-06-27 105 views
0

我有一個與其父母多對一的類。我想通過孩子暴露父母的屬性,而不直接暴露父母。我也想查詢和訂購這些屬性。查詢私人蔘考的屬性

public class Organization 
{ 
    public virtual string Name { get; set; } 
    public virtual bool IsNonProfit { get; set; } 
} 

public class Contact 
{ 
    private Organization _organization; 
    public virtual string OrganizationName 
     { get { return _organization.Name; } } 
    public virtual bool OrganizationIsNonProfit 
     { get { return _organization.IsNonProfit; } } 
} 

映射

public class OrganizationMap : ClassMap<Organization> 
{ 
    public OrganizationMap() 
    { 
     Map(x => x.Name); 
     Map(x => x.IsNonProfit); 
    } 
} 

public class ContactMap : ClassMap<Contact> 
{ 
    public ContactMap() 
    { 
     References<Organization>(Reveal.Member<Contact>("_organization")) 
      .Access.CamelCaseField(); 
    } 
} 

查詢

public class Example 
{ 
    private ISessionFactory _sessionFactory; 

    public Example(ISessionFactory sessionFactory) 
    { 
     _sessionFactory = sessionFactory; 
    } 

    public IEnumerable<Contact> DoQuery(int forPage, int rowsPerPage) 
    { 
     using (var session = _sessionFactory.OpenSession()) 
     { 
      return session.Query<Contact>().OrderBy(x => x.OrganizationName) 
       .Skip((forPage - 1) * rowsPerPage).Take(rowsPerPage); 
     } 
    } 
} 

的問題是,這會導致我n「無法解析屬性:OrganizationName」錯誤。看起來我可以用公式映射這些字段,但是最後我會爲已經加入到查詢中的表上的每個字段選擇一個子選擇。或者,我可以使用公共getter來包裝聯繫人的組織,並將我的查詢更改爲OrderBy(x => x.Organization.Name)。儘管如此,我還是違反了德米特法。

我偏離了軌道嗎?我該如何處理?

編輯,以顯示分頁

回答

0

不能在查詢中使用非映射屬性。 NHibernate應該如何知道如何爲它創建一個SQL條件?在你的情況下,它可能很容易,但如果你有一個方法的調用或該屬性中的一些複雜的邏輯呢?

所以是的,你至少需要一個公共的getter屬性。

另外,做內存中的排序(在NHibernate執行查詢後)。

+0

謝謝;在實踐中,我將這種排序與分頁相結合,因此在內存中排序並不實際。隨着公共獲得者你提倡LoD違規呢?我正在考慮它;我只是不知道我會停下來。當它是session.Query ().Where(x => Organization.HeadQuarters.Location.City ==「邁阿密」)? –

+0

@Eric是,無論是該屬性還是公式屬性(這可能會導致SQL性能不佳)。至少對於Linq查詢,我不知道Criteria/QueryOver中是否有方法。 – cremor