を使用して取得したすべての個別のアカウント名プレフィックス(az)のリストがあります
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>();
var q = accounts.Select(Projections.Distinct(
Projections.SqlFunction("substring",
NHibernateUtil.String,
Projections.Property("Name"),
Projections.Constant(1),
Projections.Constant(1))));
ただし、個別のリストを返す代わりに、プレフィックスをグループ化し、そのプレフィックスで始まるアカウントの数を返すことをしたいのですが、クエリを使用してグループを実行する方法がわかりません。これは、標準ほど単純ではないためです。 linq。
クエリではなくクエリオーバーを使用している理由は、何らかの理由でサブストリング関数がデータベースサーバーではなくメモリで実行されているためです。
これは私が通常それをする方法です
var prefixes = (from acc in this.SessionManager.GetActiveSession().Query<Account>()
group acc by acc.Name.Substring(0, 1)
into grp
select new
{
Prefix = grp.Key,
Count = grp.Count()
});
編集これは私が試したものですが、次のエラーが発生しました
式の認識されないメソッド呼び出しSqlFunction( "substring"、NHibernateUtil.String、new [] {Property( "Name")、Constant(Convert(1))、Constant(Convert(1))})
var accounts = this.SessionManager.GetActiveSession().QueryOver<Account>().Select(
Projections.Group<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1))),
Projections.Count<string>(x => Projections.SqlFunction("substring", NHibernateUtil.String,
Projections.Property("Name"), Projections.Constant(1),
Projections.Constant(1)))
);