【问题标题】:NHibernate compare concatenated propertiesNHibernate 比较级联属性
【发布时间】:2011-05-26 08:47:34
【问题描述】:

你会怎么做

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)

无济于事。

【问题讨论】:

    标签: nhibernate nhibernate-3


    【解决方案1】:

    如果您使用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

    【讨论】:

    • 谢谢。奇迹般有效。不过我有一个考虑。这不会影响性能吗?这意味着每次我检索员工时都会增加一个计算字段。
    • 我没有感觉到它会影响性能,并且考虑到大多数时候你最终会这样做(至少我知道我这样做)以及它如何帮助我进行搜索,我真的不不关心性能损失的微秒。标记为已回答。 :D
    • 它有效。为什么不? XD 如果我真的遇到性能问题,我会在以后麻烦自己。
    【解决方案2】:
    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>();
    

    【讨论】:

    • 不起作用。这与我之前的尝试相同,只是在经典 ICriteria 中。
    • @Jonn,那么您的映射可能有问题。也许您可以提供更多输入?您最初的问题甚至没有说明您有任何问题:)
    • 据我了解,您的代码与我所做的尝试(上面发布)相同,只是使用了不同的语法。它返回一个QueryException "Could not resolve property: p.Lastname + p". 我认为NHibernate 只接受映射到数据库的属性作为标准而不是公式。如果你能证明我错了会很高兴。
    猜你喜欢
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多