これは、次のフォローアップの質問です。TransformResultsの辞書へのアクセスに失敗する
次のクラスが与えられます:
public class Product
{
public string Id { get; set; }
public string Name { get; set; }
public SpecialType DefaultOffer { get; set; }
public Dictionary<SpecialType, string> Specials { get; set; }
}
public enum SpecialType
{
None = 0,
Something1,
Something2
}
次のようにインデックスを作成します。
public class ProductSummariesViaTransform : AbstractIndexCreationTask<Product>
{
public ProductSummariesViaTransform()
{
Map = products => from p in products
select new { p.Name };
TransformResults = (db, products) =>
from product in products
select new
{
Id = product.Id,
Name = product.Name,
SpecialOffer = product.Specials[product.DefaultOffer]
};
}
}
このインデックスを使用してクエリを実行すると.AsProjection<ProductSummary>()
、IdとNameは適切に入力されますが、SpecialOfferは常にnullになります。
ただし、(以下に示すように)ドキュメントを明示的にロードするように変換を変更すると、SpecialOfferは期待どおりに入力されます。
TransformResults = (db, products) =>
from product in products
let p = db.Load<Product>(product.Id) // explicit load
select new
{
Id = product.Id,
Name = product.Name,
SpecialOffer = p.Specials[p.DefaultOffer] // use explicit doc
};
Specials
TransformResultsがこれを行うための最良の方法であるかどうかという質問はさておき、ディクショナリにアクセスできるようにするために、製品ドキュメントをTransformに再度ロードする必要はないようです。
私の理解では、基礎となるドキュメントは常にトランスフォームで利用できます。私は何かが足りないのですか、それともこれはバグですか?
完全な(合格した)単体テストは、https://gist.github.com/4601829で入手できます。