1

这是一个后续问题:Accessing dictionary in TransformResults failed

给定以下类:

    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 始终为空,尽管 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字典。

我的理解是底层文档始终可用于转换。我错过了什么还是这是一个错误?

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

4

1 回答 1

2

AsProjection更改传递给 TransformResults 的数据。你需要我们AsOfType,而不是。

于 2013-01-23T07:15:09.427 回答