Lucene.Net无法使用RavenDB解析查询' IN'运算符在空字符串列表上

时间:2013-01-09 12:55:32

标签: c# lucene.net ravendb iqueryable

我已迁移到RavenDB 2.0并使用IN运算符编写查询,该运算符在解析查询时产生错误。

我使用EmbeddableDocumentStore来隔离单元测试中的问题。我目前正在运行RavenDB Embedded 2.0.2230。我已经尝试对RavenDB.Embedded 1.2.2033-Unstable运行相同的测试,并且没有报告错误。

被查询的对象是直截了当的:

public class Company
{
    public string Name { get; set; }
    public string Country { get; set; }
}

我的设置和查询如下:

var documentStore = new EmbeddableDocumentStore { RunInMemory = true };
documentStore.Initialize();

using (var session = documentStore.OpenSession())
{
    var list = new[] { "", "", "" };

    var query = from c in session.Query<Company>()
                where c.Country.In(list)
                select c;

    var companies = query.ToList();
}

查询编译但在运行时解析查询时收到以下错误:

Lucene.Net.QueryParsers.ParseException :
Could not parse modified query:
'@in<Country>:("EMPTY_STRING","EMPTY_STRING",[[EMPTY_STRING]]) '
original was:
'@in<Country>:([[EMPTY_STRING]],[[EMPTY_STRING]],[[EMPTY_STRING]]) '

正如您所看到的,集合中的最后一项已经与前面的项目进行了不同的解析。这似乎是导致问题的原因。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这似乎是RavenDB中的一个错误。实际上有两个错误,一个与您在列表中有多个空字符串时获得的转换异常有关,另一个与即使只有一个空字符串有关,.In()也没有检索到该项目空字符串。

Raven将空字符串索引为[[EMPTY_STRING]]而不是"",因为Lucene不会接收它。它适用于.Where(x == ""),但它似乎不适用于.Where(x.In(new[]{""}))

我会向他们的错误跟踪器提交一个问题。感谢。

<强>更新 从RavenDB 2.0.2236-Unstable

开始修复