2013-02-14 29 views
0

我正在使用multi-map reduce为每个可枚举的“ClientName”创建一个唯一的字符串集合“Block”名称。 (我喜欢使用多地图,因为我可以确保我的所有客户端都具有查询中的值,即使它是空的)。RavenDb中的枚举multi-map reduce返回null而不是空列表

我希望我的索引的结果返回一个空列表而不是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(...)尝试。索引工作正常,但是当没有产品包含特定客户端的块时,结果中的“块”将返回null,而不是空列表。是否有可能从索引返回空列表?列表在空时始终为空是否是预期的后果?

回答

0

您的减少量存储在FitBlocks中,但您的地图正在使用块

+0

糟糕,发布到StackOverflow时发生翻译错误。我也澄清了这个问题。该索引的工作原理,我只是尝试一种方式来返回一个空列表,而不是在缩减列表中没有元素时为空。 – craastad 2013-02-15 07:57:00