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如果我真的遇到性能问题,我以后会自找麻烦。