Lucene 使用Where()查询Raven时,是否只对前128个文档进行筛选?
我们正在使用Raven验证登录,以便人们可以进入我们的网站 我们发现,如果您这样做:Lucene 使用Where()查询Raven时,是否只对前128个文档进行筛选?,lucene,ravendb,Lucene,Ravendb,我们正在使用Raven验证登录,以便人们可以进入我们的网站 我们发现,如果您这样做: // Context is an IDocumentSession Context.Query<UserModels>() .SingleOrDefault(u => u.Email.ToLower() == email.ToLower()); //上下文是一个IDocumentSession Context.Query() .SingleOrDefault(u=>
// Context is an IDocumentSession
Context.Query<UserModels>()
.SingleOrDefault(u => u.Email.ToLower() == email.ToLower());
//上下文是一个IDocumentSession
Context.Query()
.SingleOrDefault(u=>u.Email.ToLower()==Email.ToLower());
该查询仅筛选中文档的前128个文档
掠夺我们的数据库中有几千个,所以除非你
电子邮件恰好在第一次返回的128封邮件中,你运气不好
没有Raven示例代码或任何
我在网上遇到的示例代码使用
Skip()和Take()循环遍历集合
public T SingleWithIndex(string indexName, Func<T, bool> where)
{
var pageIndex = 1;
const int pageSize = 1024;
RavenQueryStatistics stats;
var queryResults = Context.Query<T>(indexName)
.Statistics(out stats)
.Customize(x => x.WaitForNonStaleResults())
.Take(pageSize)
.Where(where).SingleOrDefault();
if (queryResults == null && stats.TotalResults > pageSize)
{
for (var i = 0; i < (stats.TotalResults / (pageIndex * pageSize)); i++)
{
queryResults = Context.Query<T>(indexName)
.Statistics(out stats)
.Customize(x => x.WaitForNonStaleResults())
.Skip(pageIndex * pageSize)
.Take(pageSize)
.Where(where).SingleOrDefault();
if (queryResults != null) break;
pageIndex++;
}
}
return queryResults;
public T SingleWithIndex(字符串索引名,Func-where)
{
var pageIndex=1;
常量int pageSize=1024;
拉文奎尔统计数据;
var queryResults=Context.Query(indexName)
.统计数据(统计数据)
.Customize(x=>x.WaitForNonSaleResults())
.Take(页面大小)
.Where(Where.SingleOrDefault();
if(queryResults==null&&stats.TotalResults>pageSize)
{
对于(var i=0;i<(stats.TotalResults/(pageIndex*pageSize));i++)
{
queryResults=Context.Query(indexName)
.统计数据(统计数据)
.Customize(x=>x.WaitForNonSaleResults())
.Skip(页面索引*页面大小)
.Take(页面大小)
.Where(Where.SingleOrDefault();
如果(queryResults!=null)中断;
pageIndex++;
}
}
返回查询结果;
}
编辑:
使用下面的修复程序不会将查询参数传递给我的RavenDB实例。还不知道为什么
Context.Query<UserModels>()
.Where(u => u.Email == email)
.SingleOrDefault();
Context.Query()
.其中(u=>u.电子邮件==电子邮件)
.SingleOrDefault();
最后,我使用高级Lucene语法而不是linq查询,一切正常。RavenDB不理解
SingleOrDefault
,因此它在没有过滤器的情况下执行查询。然后在结果集上执行您的条件,但默认情况下Raven只返回前128个文档。
相反,你必须打电话
Context.Query()
.其中(u=>u.电子邮件==电子邮件)
.SingleOrDefault();
所以过滤是由RavenDB/Lucene完成的。我将此交叉发布到google组,Ayende提到他们还不支持SingleOrDefault()中的谓词。我的问题是linq查询没有将查询参数传递给我的服务器。