如何获得RavenDb中相关项目的计数?

时间:2015-04-30 01:28:54

标签: c# ravendb

在RavenDb中,我正在尝试获取包含计数的项目列表。

使用Raven示例数据库作为简化示例,我想获得一个类别列表,其中包含每个类别中的产品数量。

相关课程:

public class Category
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Product
{
    public string Id { get; set; }
    public string Category { get; set; }
    // ...others removed...
}

部分工作查询(但错过了0次)

以下查询似乎有效(我正在使用.Dump();用于Linqpad):

using (var session = docStore.OpenSession()) {
    var products = session
        .Query<Product>()
        .Customize(x => x.Include<Product>(p => p.Category))
        .ToArray() 
        .GroupBy(x => x.Category)
        .Select(x => new {
            category = session.Load<Category>(x.Key), 
            numProducts = x.Count()
        })
        .Dump();

    session.Advanced.NumberOfRequests.Dump("NumberOfRequests");
}

enter image description here

问题在于,如果某个类别没有产品,则不会包含在结果集中。

(另外,这是执行此查询的正确方法吗?对服务器的一个请求提示我,至少可怕地偏离轨道)

使用非常糟糕的查询

更正结果

诉诸蛮力,我可以使用代码:

using (var session = docStore.OpenSession()) {
    var categories = session
        .Query<Category>();

    var categoryCounts = new Dictionary<Category,int>();
    foreach (var category in categories) 
    {
        if (!categoryCounts.ContainsKey(category)) categoryCounts.Add(category,0);
        categoryCounts[category] += session
            .Query<Product>()
            .Where(p => p.Category == category.Id)
            .Count();
    }
    categoryCounts.Dump();

    session.Advanced.NumberOfRequests.Dump("NumberOfRequests");
}

enter image description here

但这显然是一种可怕的方式,导致1 + n个请求(其中n ==类别数)。

如何获取产品类别+数量,包括没有产品的类别,并且不会产生1 + n个请求?

对于具有数百个类别和数十万(甚至数百万)产品的数据库(单独一个类别可能有数十万个)的不同考虑因素是什么?

0 个答案:

没有答案