1

ユーザーのお気に入りのタグとブロックされたタグでLiceneQueryをフィルタリングする必要があります。ユーザーがお気に入りのタグとブロックされたタグを持っている場合、これは機能しますが、ユーザーがお気に入りのタグまたはブロックされたタグを持っていない場合に苦労しています。MatchAllDocsQueryと同等のものを使用する必要があると思いますが、RavenDBクライアントAPIを使用してこれを実現する方法がわかりません。

これは、ユーザーが1つ以上のお気に入りタグと1つ以上のブロックされたタグを持っている場合に正常に機能します。

string favesQuery = String.Join(" OR ", user.FavouriteTags.Select(x => String.Format("Tags:{0}", x)));
string blockedQuery = String.Join(" AND ", user.BlockedTags.Select(x => String.Format("-Tags:{0}", x)));
var articles = RavenSession.Advanced
                           .LuceneQuery<Article>("AllDocs/ByTags")
                           .Include(x => x.Author)
                           .Where(favesQuery)
                           .Boost(0.5m)
                           .Where(blockedQuery)
                           .OrderByDescending(x => x.DatePublished);

私が得ている当面の問題はですが、Missing where clauseこれは、がString.Join空のときにが空の文字列を返すためuser.FavouriteTagsです。favesQueryとに何かを追加できますblockedQueryか?

SQL用語で考えると、私はWHERE 1=1 AND ...

関連する質問https://groups.google.com/forum/?fromgroups=#!topic/ravendb/JKTpHiFRJLc

4

1 に答える 1

1

LINQメソッドの構造を再考してください。

var articles = RavenSession.Advanced
                           .LuceneQuery<Article>("AllDocs/ByTags")
                           .Include(x => x.Author);
if (user.FavouriteTags.Any()) {
    string favesQuery = String.Join(" OR ", user.FavouriteTags.Select(x => String.Format("Tags:{0}", x)));
    articles = articles.Where(favesQuery).Boost(0.5m);
}
if (user.BlockedTags.Any()) {
    string blockedQuery = String.Join(" AND ", user.BlockedTags.Select(x => String.Format("-Tags:{0}", x)));
    articles = articles.Where(blockedQuery);
}
articles = articles.OrderByDescending(x => x.DatePublished);
于 2012-11-02T23:24:16.213 に答える