2011-05-26 51 views
1

你会怎么做这NHibernate的比较级联特性

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) 

无济于事。

回答

2

如果您映射这三列,使用Formula一个属性,它会工作:

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. 
    } 
} 

使用SQL Server,Oracle中这是一个例子,你会切换'|和沟LTRIMRTRIM

+0

你可以做到这一点?甜!明天试试吧 – Jonn 2011-05-26 15:37:23

+0

@Jonn - 看看http://codebetter.com/kylebaley/2010/07/30/using-an-nhibernate-formula-to-aid-searching/ – rebelliard 2011-05-26 17:58:14

+0

谢谢。奇迹般有效。尽管我有一个考虑。这不会影响性能吗?这意味着每次检索员工时都会有一个额外的计算字段。 – Jonn 2011-05-27 00:52:58

0
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>(); 
+0

不起作用。这与我以前的尝试是一样的,只有在经典的ICriteria中。 – Jonn 2011-05-26 09:45:16

+0

@Jonn,那么它可能是你的映射的问题。也许你可以提供更多的输入?你最初的问题甚至没有说明你有任何问题:) – Oleg 2011-05-26 10:10:40

+0

从我所了解的情况来看,你的代码与我所做的(上面发布的)尝试相同,只是使用了不同的语法。它返回一个'QueryException“无法解析属性:p.Lastname + p”。“我认为NHibernate只接受映射到数据库的属性而不是公式。如果你能证明我错了,会很高兴。 – Jonn 2011-05-27 00:47:31