我有一个场景,我需要在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中?
答案 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