1

これは、次のフォローアップの質問です。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
                                };

SpecialsTransformResultsがこれを行うための最良の方法であるかどうかという質問はさておき、ディクショナリにアクセスできるようにするために、製品ドキュメントをTransformに再度ロードする必要はないようです。

私の理解では、基礎となるドキュメントは常にトランスフォームで利用できます。私は何かが足りないのですか、それともこれはバグですか?

完全な(合格した)単体テストは、https://gist.github.com/4601829で入手できます。

4

1 に答える 1

2

AsProjectionTransformResultsに渡されるデータを変更します。代わりに、私たちAsまたはに必要です。OfType

于 2013-01-23T07:15:09.427 に答える