内部属性的RavenDB查询使用[JsonProperty]序列化

时间:2013-06-13 20:06:36

标签: c# ravendb

我无法使用[JsonProperty]从RavenDB查询。

以下测试不起作用。

(注意:我知道我使用了新的命名空间Raven.Imports.Newtonsoft.Json):

using System.Linq;
using NUnit.Framework;
using Raven.Client.Embedded;
using Raven.Imports.Newtonsoft.Json;

namespace RavenTest
{
    [TestFixture]
    public class RavenFixture
    {
        protected EmbeddableDocumentStore DocumentStore;

        [SetUp]
        public void BaseSetUp()
        {
            DocumentStore = new EmbeddableDocumentStore { RunInMemory = true };
            DocumentStore.Initialize();
        }

        [Test]
        public void Test()
        {
            using (var session = DocumentStore.OpenSession())
            {
                session.Store(new Parent {Inner = new Child {Num = 1}});
                session.SaveChanges();
            }

            using (var session = DocumentStore.OpenSession())
            {
                var list = session.Query<Parent>().Customize(x => x.WaitForNonStaleResultsAsOfNow())
                       .Where(x => x.Inner.Num == 1)
                       .ToList();

                Assert.That(list.Count, Is.EqualTo(1));
            }
        }

        public class Parent
        {
            public string Id { get; set; }

            //If you comment this out, it will work
            [JsonProperty("N")]
            public Child Inner { get; set; }
        }

        public class Child
        {
            [JsonProperty("M")]
            public int Num { get; set; }
        }
    }
}    

但是,如果我注释掉[JsonProperty("N")]行,它会按预期工作。

这是一个错误还是我做错了什么?

我正在使用RavenDB 2.5.0.0(最新版)

1 个答案:

答案 0 :(得分:1)

这似乎是DocumentSession.Query&lt;&gt;的查询提供程序中的错误它不会尊重文档中的Newtonsoft属性。

但是,如果您使用Lucene查询提供程序,它将按预期执行:

    [Test]
    public void Test()
    {
        using (var session = DocumentStore.OpenSession())
        {
            session.Store(new Parent {Inner = new Child {Num = 1}});
            session.SaveChanges();
        }

        using (var session = DocumentStore.OpenSession())
        {
            var list = session.Advanced.LuceneQuery<Parent>()
                   .WhereEquals(x => x.Inner.Num, 1)
                   .ToList();

            Assert.That(list.Count, Is.EqualTo(1));
        }
    }