以下のような検索方法があります。ユーザー検索テキストを分割して、異なるテーブルのいくつかの列で検索したいと考えています。
string[] searchedTexts = null;
if(searchText!=null)
searchedTexts = searchText.Split(new[] { ',', ' ' }, StringSplitOptions.RemoveEmptyEntries);
WebsitePage page = null;
Account account = null;
AccountLogin login = null;
Author author = null;
var query = Session.QueryOver<WebsitePage>(() => page).Where(() => page.Status == WebsitePageStatus.Online).Left
.JoinQueryOver<Author>(x => x.Blogger, () => author).Left
.JoinQueryOver<Account>(x => x.AccountInfo, () => account).Left
.JoinQueryOver<AccountLogin>(x => x.Logins, () => login);
if (searchedTexts != null)
{
var disconjaction = Expression.Disjunction();
foreach (var text in searchedTexts)
{
disconjaction.Add(Expression.Like(Projections.Property(() => page.Title), text, MatchMode.Anywhere));
disconjaction.Add(Expression.Like(Projections.Property(() => page.Body), text, MatchMode.Anywhere));
disconjaction.Add(Expression.Like(Projections.Property(() => page.TagCommaSeperated), text, MatchMode.Anywhere));
disconjaction.Add(Expression.Like(Projections.Property(() => account.FirstName), text, MatchMode.Anywhere));
disconjaction.Add(Expression.Like(Projections.Property(() => account.LastName), text, MatchMode.Anywhere));
disconjaction.Add(Expression.Like(Projections.Property<AccountLogin>(x => x.UserName), text, MatchMode.Anywhere));
}
query.And(disconjaction);
}
return query.List();
Expression.Like() メソッドでわかるように、同じパラメーターを使用しました。実行後、nhibernate は次のように「Like」式ごとに異なるパラメーターを追加します。
@p1=N'%test%',@p2=N'%test%',@p3=N'%test%',@p4=N'%search%',@p5=N'%search%',@p6=N'%search%'
foreach の各ループで、6 つの「Like」式すべてで 1 つの sqlparameter を使用したいと考えています。出来ますか ?