TransformResults在字典上失败

时间:2013-01-23 04:20:58

标签: ravendb

这是一个跟进问题:Accessing dictionary in TransformResults failing

鉴于以下类别:

    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>()使用此索引进行查询,则SpecialOffer始终为null,但Id和Name已正确填充。

但是,如果我将转换更改为显式加载文档(如下所示),则会按预期填充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
                                };

不考虑TransformResults是否是执行此操作的最佳方式,似乎无需在Transform中再次加载Product文档以便能够访问Specials字典。

我的理解是基础文档始终可用于Transform。我错过了什么或者这是一个错误吗?

完整(通过)单元测试可在https://gist.github.com/4601829获得。

1 个答案:

答案 0 :(得分:2)

AsProjection更改传递给TransformResults的数据。 您需要我们AsOfType