1

我有一个场景,我需要在 NHibernate QueryOver 查询中对属性 (User.Name) 进行排序,其中该属性包含一个字符串,我需要获取名称的最后一部分并订购 ASC。如果我对返回的结果执行此操作,则可能类似于:

.....
var query = session.QueryOver<User>().....
.....
query.OrderBy(u => SortByLastName(u.Name));

private string SortByLastName(string name)
    {
        if (string.IsNullOrEmpty(name)) {
            name = " ";
        }

        var nameArray = name.Trim().Split(' ');
        var lastName = nameArray[nameArray.Length - 1];

        return lastName.ToLower();
    }

在 SQL 中,它将是 SUBSTRING、CHARINDEX(可能还有其他函数)的组合,以获取名称的最后部分(即 Joe Smith、Jane A. Doe)并按姓氏排序。

问题

在 NHibernate QueryOver 中是否有一种方法可以设置它,您不必在 NHibernate 调用的存储过程中汇总它或通过 .CreateSQlQuery(sql) 传递原始 SQL 查询?

而是直接将此逻辑构建到 QueryOver 中?

4

1 回答 1

3

您可以通过创建Projections调用 SQL 函数来做到这一点。在您的情况下,存在嵌套函数,因此将有多个构建步骤。

这是一个草案解决方案。我没有测试过它,但它给出了该方法的想法:

IProjection nameField = Projections.Property<User>(u => u.Name);
IProjection charIndex = Projections.SqlFunction("CHARINDEX",
                                                NHibernateUtil.String,
                                                nameField,
                                                Projections.Constant(" ", NHibernateUtil.String)
                                               );
IProjection subString = Projections.SqlFunction("SUBSTRING",
                                                nHibernateUtil.String,
                                                nameField,
                                                charIndex,
                                                Projections.Constant(999, NHibernateUtil.UInt32);



var query = session.QueryOver<User>().OrderBy(subString).Asc;

不幸的是,如果名字中有空格,此解决方案将不起作用。(简·A·多伊)。我不知道用于查找字符串中最后一个空格的 SQL 函数。

请参阅此讨论: 使用 T-SQL 查找子字符串最后出现的索引

于 2013-08-12T23:38:25.677 回答