有没有办法使用Nhibernate QueryOver创建属性筛选器排序

时间:2013-08-12 22:45:39

标签: sql nhibernate fluent-nhibernate queryover

我有一个场景,我需要在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)传入Raw SQL查询的存储过程中将其汇总?

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

1 个答案:

答案 0 :(得分:3)

您可以通过创建调用SQL函数的Projections来完成此操作。在您的情况下,有嵌套函数,因此将有多个构建步骤。

这是一个解决方案草案。我还没有对它进行测试,但它给出了这种方法的想法:

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;

不幸的是,如果名字中有空格,这个解决方案将无效。 (Jane A. Doe)。我不知道SQL函数来查找字符串中的最后一个空格。

见这个讨论: Find index of last occurrence of a sub-string using T-SQL