Ravendb 在字典上转换失败的结果
这是以下问题的后续问题: 鉴于以下类别:Ravendb 在字典上转换失败的结果,ravendb,Ravendb,这是以下问题的后续问题: 鉴于以下类别: public class Product { public string Id { get; set; } public string Name { get; set; } public SpecialType DefaultOffer { get; set; } public Dictionary<SpecialType, string> Specials {
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
}
公共类产品
{
公共字符串Id{get;set;}
公共字符串名称{get;set;}
public SpecialType DefaultOffer{get;set;}
公共字典专用项{get;set;}
}
公共枚举特殊类型
{
无=0,
有些事情1,
什么
}
我创建了一个索引,如下所示:
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]
};
}
}
公共类ProductSummaresViaTransform:AbstractIndexCreationTask
{
公共产品摘要ViaTransform()
{
Map=products=>来自products中的p
选择新的{p.Name};
TransformResults=(数据库、产品)=>
从产品到产品
选择新的
{
Id=product.Id,
Name=product.Name,
SpecialOffer=product.Specials[product.DefaultOffer]
};
}
}
如果我使用.AsProjection()
使用此索引进行查询,则SpecialOffer始终为空,尽管Id和名称已正确填充
但是,如果我将转换更改为显式加载文档(如下所示),则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=(数据库、产品)=>
从产品到产品
设p=db.Load(product.Id)//显式加载
选择新的
{
Id=product.Id,
Name=product.Name,
SpecialOffer=p.Specials[p.DefaultOffer]//使用显式文档
};
抛开TransformResults是否是实现这一点的最佳方式的问题不谈,似乎不必在转换中再次加载产品文档,以便能够访问Specials
字典
我的理解是,转换始终可以使用底层文档。我是遗漏了什么还是这是一个错误
完整的(通过的)单元测试可在。
AsProjection
更改传递给TransformResults的数据。
您需要将
作为
或类型的发送给我们。谢谢Ayende。这就解决了问题。关于何时使用As()和AsProjection()有什么指导吗?废话。刚刚发现了这一差异的原因。