1

UIのフィルターで使用できるように、アカウント名のプレフィックスを見つけようとしています。

ただし、次のlinqステートメントを実行すると、常にアカウント名全体が返され、サブ文字列が実行されます。同等のSQLを書く代わりに。

return this.Accounts(user).Select(x => x.Name.Substring(0, 1)).ToList().Distinct();

this.AccountsはIQuery可能であるため、データベースへのコールバックを強制しないでください。

それらすべてを返し、結果の名前をサブストリング化する理由はありますか、それとも有効な代替手段がありますか?

編集

private IQueryable<Account> Accounts(User user)
{
  var accounts = this.SessionManager.GetActiveSession().Query<Account>().Where(x => x.Company.Id == user.Company.Id);
  if (!user.IsAdmin && user.AccountProfiles.Any())
  {
    accounts = accounts.Where(x => x.AssociatedProfiles.Any(y => y.Users.Any(z => z.Id == user.Id)));
  }

  return accounts;
}
4

1 に答える 1

1

プロパティAccountのみを含む単純なクラスを作成しました。string Name

session.Query<Account>()SQLの結果に対して実行される最初のブロックは、次のようになります。

select
    substring(account0_.Name,
    @p0+1,
    @p1) as col_0_0_
from
    Account account0_;
@p0 = 0 [Type: Int32 (0)],
@p1 = 1 [Type: Int32 (0)]

通話後Distinct()残ったことは注目に値します。そうでなければ、あなたはより良いものを手に入れるでしょう:ToList()

select
    distinct substring(account0_.Name,
    @p0+1,
    @p1) as col_0_0_
from
    Account account0_;
@p0 = 0 [Type: Int32 (0)],
@p1 = 1 [Type: Int32 (0)]

私の提案は、Accounts(User)メソッドを1つのステートメントに減らすことです。

return SessionManager.GetActiveSession().Query<Account>();

...そして失敗するまで残りを追加し始めます。

補足:最新のNHibernate安定版リリース(現在は3.3.0)を使用して行われたすべてのテスト

于 2012-05-28T18:30:51.723 に答える