2

是否可以向實體中的派生字段添加限制,即,一個不堅持?例如,如果這是我的實體:我可以查詢NHibernate中的派生字段嗎?

public class Employee 
{ 
    public long Id { get; set; } 
    public string Forename { get; set; } 
    public string Surname {get; set; } 
    public string FullName { get { return Forename + " " + Surname; }} 
} 

,這是映射:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
       namespace="Domain.Entities" 
       assembly="Domain"> 
    <class name="Employee" table="`Employee`"> 
    <id name="Id" column="Id" type="long"> 
     <generator class="identity"/> 
    </id> 
    <property name="Forename"/> 
    <property name="Surname"/> 
    </class> 
</hibernate-mapping> 

這是我的查詢:

public Employee GetByFullName(string fullName) 
{ 
    return _session 
     .CreateCriteria<Employee> 
     .Add(Restrictions.Eq("FullName", fullName)) 
     .List<Employee>(); 
} 

請忽略的事實,我可以寫查詢我自己,這是一個微不足道的例子來演示。這在更復雜的情況下會很有用。

+0

你也可以做這樣的事情:http://stackoverflow.com/questions/6709463/fuzzy-search-on-a-concatenated-full-name-using-nhibernate –

回答

4

這取決於,基本上如果你可以用SQL複製派生字段,那麼它可以完成(基本上可以完成,但它的實用性會有所不同)。在您的例子中,你將需要映射你的全名屬性,如:

<property name="Fullname" formula="Forename + ' ' + Surname"/> 

然後從抱怨阻止NHibernate的,你需要定義全名空二傳手:

public virtual string Fullname { 
    get { return Forename + " " + Surname; } 
    set { } // do nothing 
} 

然後,你就可以查詢全名和NHibernate將公式插入到SQL正確。

+0

會需要一個名爲'全名'在這個數據庫表中? –

+0

不,NHibernate將使用全名替換您在映射中定義的公式,當它發出SQL查詢時 –

+0

我的問題是一個簡單的例子,用來說明更多先進的scaenarios,例如遍歷關係並具有複雜算法的派生字段。雖然這不適用於所有情況,但它的確回答了這個問題。 –

1

否.Hibernate/NHibernate中的查詢總是被轉換爲SQL。如果該字段不在數據庫中,則無法查詢。

相關問題