NHibernate比较连接属性
你会怎么做NHibernate比较连接属性,nhibernate,nhibernate-3,Nhibernate,Nhibernate 3,你会怎么做 Select * from Personnel p where p.LastName + ', ' + p.FirstName + ' ' + p.MiddleInitial LIKE @Employee + '%' 使用NHibernate(3.0)?到目前为止,我已经试过了 personnel.QueryOver<Personnel>() .WhereRestrictionOn( x => x.LastName + ', ' + x.FirstName
Select *
from Personnel p
where p.LastName + ', ' + p.FirstName + ' ' + p.MiddleInitial LIKE @Employee + '%'
使用NHibernate(3.0)?到目前为止,我已经试过了
personnel.QueryOver<Personnel>()
.WhereRestrictionOn( x => x.LastName + ', ' + x.FirstName + ' ' + x.MiddleInitial)
.IsLike(employeeName, MatchMode.Start)
personal.QueryOver()
.WhereRestrictionOn(x=>x.LastName+,'+x.FirstName+''+x.MiddleInitial)
.IsLike(employeeName,MatchMode.Start)
无效。ICriteria-criteria-criteria=session.CreateCriteria(typeof(IPersonnel));
ICriteria criteria = session.CreateCriteria(typeof(IPersonnel));
criteria.CreateCriteria("Personnel", "p");
criteria.Add(Restrictions.Like("p.LastName + p.FirstName + p.MiddleInitial", employeeName));
criteria.SetResultTransformer(CriteriaSpecification.DistinctRootEntity);
return criteria.List<IPersonnel>();
标准。创建标准(“人员”、“p”);
添加(限制,如(“p.LastName+p.FirstName+p.MiddleInitial”,employeeName));
标准.SetResultTransformer(标准规范.距离);
返回条件。List();
如果使用公式将这三列映射为单个属性,则它将起作用:
public class EmployeeMap : ClassMap<Employee>
{
public EmployeeMap()
{
Table("Employees");
Id(x => x.Id);
Map(x => x.Name)
.Formula("UPPER(LTRIM(RTRIM(FirstName + ' ' + MiddleName + ' ' + LastName)))");
// etc.
}
}
公共类EmployeeMap:ClassMap
{
公共雇员地图()
{
表(“雇员”);
Id(x=>x.Id);
映射(x=>x.Name)
.公式(“上部(LTRIM(RTRIM(FirstName+“”+MiddleName+“”+LastName)))”;
//等等。
}
}
这是一个使用SQL Server的示例,在Oracle中,您可以将
切换为
,而将LTRIM
和RTRIM
切换为不工作。这与我之前的尝试相同,只是在经典的ICriteria中。@Jonn,那么可能是您的映射有问题。也许你可以提供更多的信息?您最初的问题甚至没有说明您有任何问题:)据我所知,您的代码与我所做的尝试(在上面发布)相同,只是使用了不同的语法。它返回一个QueryException“无法解析属性:p.Lastname+p”。
我认为NHibernate只接受映射到数据库的属性作为条件,而不接受公式。如果你能证明我错了,我会很高兴的。@Jonn-看看谢谢。工作起来很有魅力。不过我有一个考虑。这不会影响性能吗?这意味着每次检索员工时都会有一个额外的计算字段。我没有感觉到它会影响绩效,考虑到大多数情况下您最终会以何种方式这样做(至少我知道我会这样做),以及它如何帮助我搜索,我真的不在乎绩效损失的微秒。按回答做标记DIt有效。为什么不呢?XD如果我真的遇到性能问题,我以后会自找麻烦。