列挙可能な「ClientName」ごとに、文字列「ブロック」名の一意のコレクションを作成するために、マルチマップ削減を使用しています。(空であっても、すべてのクライアントがクエリに値を持っていることを確認できるため、マルチマップを使用するのが好きです)。
そのクライアントのどの製品にもブロックが見つからない場合、インデックスの結果が 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 を返します。ここでインデックスから空のリストを返すことは可能ですか? リストが空のときに常に null になるのは、意図した結果ですか?