我需要针对与多个属性匹配的文档集合进行查询 (来自邮件列表的交叉帖子:https://groups.google.com/forum/?fromgroups=#!topic/ravendb/r5f1zr2jd_o)
以下是文件:
public class SessionToken
{
[JsonProperty("jti")]
public string Id { get; set; }
[JsonProperty("aud")]
public Uri Audience { get; set; }
[JsonProperty("sub")]
public string Subject { get; set; }
[JsonProperty("claims")]
public Dictionary<string, string> Claims { get; set; }
}
这是测试:
[TestFixture]
public class RavenDbTests
{
private IDocumentStore documentStore;
[SetUp]
public void SetUp()
{
this.documentStore = new EmbeddableDocumentStore() { RunInMemory = true };
this.documentStore.Initialize();
}
[Test]
public async void FirstOrDefault_WhenSessionTokenExists_ShouldReturnSessionToken()
{
var c = new SessionToken()
{
Audience = new Uri("http://localhost"),
Subject = "NUnit",
Claims = new Dictionary<string, string>()
{
{ ClaimTypes.System, "NUnit" }
}
};
using (var session = this.documentStore.OpenAsyncSession())
{
await session.StoreAsync(c);
await session.SaveChangesAsync();
// Check if the token exists in the database without using Where clause
var allTokens = await session.Query<SessionToken>().ToListAsync();
Assert.That(allTokens.Any(x => x.Subject == "NUnit" && x.Audience == new Uri("http://localhost")));
// Try getting token back with Where clause
var token = await session.Query<SessionToken>().Customize(x => x.WaitForNonStaleResults()).Where(x => x.Subject == "NUnit" && x.Audience == new Uri("http://localhost")).ToListAsync();
Assert.IsNotNullOrEmpty(token.First().Id);
}
}
}
最后一个断言是失败的断言。 我必须承认,我不确定这是一个错误还是我的失败 据我了解,这应该有效。
PS。我尝试使用独立的文档存储以及嵌入式而不在内存中运行,但结果相同。
答案 0 :(得分:2)
你得到陈旧的结果。在单元测试中,您需要留出时间进行索引编制。
将.Customize(x=> x.WaitForNonStaleResults())
添加到您的查询中,测试应该通过。
此外,我认为您剪切/粘贴时会将Id
属性从您的问题中删除,因为它不会按原样编译。
<强>更新强>
根据评论中的讨论,问题在于您将[JsonProperty]
属性应用于Id
属性。由于Id
属性表示文档密钥,并且未作为JSON文档的一部分进行序列化,因此您无法将[JsonProperty]
属性应用于该文档。