1

名前の最後の部分を取得して ASC を注文するために必要な文字列がプロパティに含まれている NHibernate QueryOver クエリで、プロパティ (User.Name) の並べ替えを実行する必要があるシナリオがあります。返された結果でそれを行っていた場合、次のようになります。

.....
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 では、名前の最後の部分 (つまり、Joe Smith、Jane A. Doe) を取得し、姓でソートするために、SUBSTRING、CHARINDEX (および場合によっては他の関数) を組み合わせます。

質問

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 に答える