使用RavenDB进行一对多查询(&T) [英] "Traditional" one-to-many Query with RavenDB

查看:0
本文介绍了使用RavenDB进行一对多查询(&T)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道RavenDB的include-特性。它允许我在数据库的一次往返过程中立即获取引用的文档。但我的问题是:我首先获取的文档不包括对&Other&Quot;文档的引用。但其他";文档引用了当前文档。

想象一下我们在世界各地都有站点的设置。每个site可能会触发各种警报。每个alarm都引用了site途径siteId

现在我想获得包括所有警报在内的所有站点的列表。但看起来,这在RavenDB中是不可能的?因为include只接受site文档中的";路径";,该文档保存引用文档的ID(或ID数组)。

这可以通过在site'-document and referencing this array in include. But in contrast to a lot of examples featuring stuff like an orderwithlineItemswhere the order is a self contained thing, mysite`内提供一个数组alarmIds来解决,该数组将运行数年,收集0到100万之间的任何警报。这对我来说似乎是个坏主意。

当然,我可以反过来:通过sitesId查询所有警报和include站点。但这不会返回没有警报的站点。

那么这只是我这边的一个设计错误吗?我误解了什么吗?或者,是否无法在一个查询中完成此操作并阻止一次查询?

推荐答案

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

public class B
{
    public string Id { get; set; }
    public string A { get; set; }
}

public class MultiMapIndex : AbstractMultiMapIndexCreationTask<MultiMapIndex.Result>
{
    public class Result
    {
        public string Id { get; set; }
        public IEnumerable<string> Bs { get; set; }
    }

    public MultiMapIndex()
    {
        AddMap<A>(items => from a in items
            select new Result {Id = a.Id, Bs = new string[0]});

        AddMap<B>(items => from b in items
            select new Result {Id = b.A, Bs = new[] {b.Id}});

        Reduce = results => from result in results
            group result by result.Id
            into g
            select new Result {Id = g.Key, Bs = g.SelectMany(r => r.Bs)};
    }
}

[Fact]
public async Task TestCase()
{
    using var store = GetDocumentStore();

    await new MultiMapIndex().ExecuteAsync(store);
    using (var session = store.OpenAsyncSession())
    {
        await session.StoreAsync(new B {A = "a/1"}, "b/0");
        await session.StoreAsync(new A(), "a/1");
        await session.StoreAsync(new A(), "a/2");
        await session.SaveChangesAsync();
    }

    WaitForIndexing(store);

    using (var session = store.OpenAsyncSession())
    {
        var results = await session.Query<MultiMapIndex.Result, MultiMapIndex>()
            .Include(r => r.Bs)
            .ToArrayAsync();

        var before = session.Advanced.NumberOfRequests;

        var bs = session.LoadAsync<B>(results[0].Bs);

        Assert.Equal(before, session.Advanced.NumberOfRequests);
    }
}

这篇关于使用RavenDB进行一对多查询(&T)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆