我需要通过用户喜欢和阻止的标签来过滤LiceneQuery。当用户有一些喜欢和被阻止的标签时,我已经有了这个工作,但我正在努力解决用户没有收藏或阻止标签的情况。我相信我需要使用相当于MatchAllDocsQuery但我无法通过RavenDB客户端API看到如何实现这一点。
当用户拥有一个或多个收藏夹以及一个或多个被阻止的标签时,此功能正常:
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
答案 0 :(得分: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);