在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...
}
以下查询似乎有效(我正在使用.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");
}
问题在于,如果某个类别没有产品,则不会包含在结果集中。
(另外,这是执行此查询的正确方法吗?对服务器的一个请求提示我,至少可怕地偏离轨道)
诉诸蛮力,我可以使用代码:
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");
}
但这显然是一种可怕的方式,导致1 + n个请求(其中n ==类别数)。
如何获取产品类别+数量,包括没有产品的类别,并且不会产生1 + n个请求?
对于具有数百个类别和数十万(甚至数百万)产品的数据库(单独一个类别可能有数十万个)的不同考虑因素是什么?