我可以查询NHibernate中的派生字段吗?

我可以查询NHibernate中的派生字段吗?,hibernate,nhibernate,nhibernate-mapping,hibernate-mapping,Hibernate,Nhibernate,Nhibernate Mapping,Hibernate Mapping,是否可以向实体中的派生字段(即未持久化的字段)添加限制?例如,如果这是我的实体: 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; }}

是否可以向实体中的派生字段(即未持久化的字段)添加限制?例如,如果这是我的实体:

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>();
}
公共雇员GetByFullName(字符串fullName) { 返回会话 .CreateCriteria .Add(Restrictions.Eq(“全名”,全名)) .List(); }
请忽略我可以自己编写查询的事实,这是一个简单的示例。这在更复杂的场景中非常有用。

否。Hibernate/NHibernate中的查询总是转换为SQL。如果字段不在数据库中,则无法查询。

这取决于,基本上,如果您可以使用SQL复制派生字段,则可以执行此操作(因此基本上可以执行此操作,但其实用性有所不同)。在您的示例中,您需要映射Fullname属性,如:

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

然后您就可以查询Fullname,NHibernate将正确地将公式插入sql。

数据库表中是否需要一个名为“Fullname”的字段,NHibernate在发布SQL查询时将使用映射中定义的公式替换您对Fullname的使用我的问题是一个简单的示例,用于说明更高级的scaenarios,例如遍历关系并具有复杂算法的派生字段。虽然这并不适用于所有情况,但它确实回答了手头的问题。如果您的情况很复杂,您可以定义一个SQL函数来复制它,它可以遍历关系/连接,并具有复杂的算法。如果您使用的是SQL Server,则可以链接到.NET程序集以定义更复杂的函数,并在属性的公式映射中调用该函数。您还可以执行以下操作:
public virtual string Fullname {
    get { return Forename + " " + Surname; }
    set { } // do nothing
}