我可以查询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
}