0

我正在使用多映射减少来为每个可枚举的“客户端名称”创建一个唯一的字符串集合,“块”名称。(我喜欢使用多映射,因为我可以确保我的所有客户端在查询中都有一个值,即使它是空的)。

当在该客户端的任何产品中找不到块时,我希望我的索引结果返回一个空列表而不是 null。这是我的索引。

public class Client_Blocks
    : AbstractMultiMapIndexCreationTask<Client_Blocks.Result>
{
    public class Result
    {
        public Client.Names ClientName { get; set; }
        public IEnumerable<string> Blocks { get; set; }
    }

    public Client_Blocks()
    {
        AddMap<Product>(products =>   
            from product in products
            where product.Details != null
            where product.Details.Block != null
            select new
            {
                ClientName = product.ClientName,
                Blocks = new List<string>{product.Details.Block}
            });

        AddMap<Client>(clients =>
            from client in clients
            select new
            {
                ClientName = client.Name,
                Blocks = new List<string>()
            });

        Reduce = results => from result in results
            group result by result.ClientName
            into g
            select new
            {
                ClientName = g.Key,
                Blocks = g.Any() ? 
                         g.SelectMany(x => x.Blocks).Distinct() :
                         new List<string>()
            };
    }
}

我也尝试使用g != null而不是g.Any()并且只有g.SelectMany(...). 索引工作正常,但当特定客户没有带有 Blocks 的产品时,结果中的“Blocks”返回 null 而不是空列表。是否可以从索引中返回一个空列表?列表为空时始终为空是预期的结果吗?

4

1 回答 1

0

Your reduce is stored FitBlocks, but your maps are using Blocks

于 2013-02-14T15:20:31.667 回答