我正在使用多映射减少来为每个可枚举的“客户端名称”创建一个唯一的字符串集合,“块”名称。(我喜欢使用多映射,因为我可以确保我的所有客户端在查询中都有一个值,即使它是空的)。
当在该客户端的任何产品中找不到块时,我希望我的索引结果返回一个空列表而不是 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 而不是空列表。是否可以从索引中返回一个空列表?列表为空时始终为空是预期的结果吗?