是否可以仅加载Ravendb文档的一部分。
我想通过id获取文档,但只应提取一些字段。
我知道我可以session.Query
使用Select
调用,但后来我无法查询文档的ID,所以我必须使用session.Load
代替,但这会获取整个文档。
我需要为此创建一个索引吗?
答案 0 :(得分:1)
您可以使用名为结果变形金刚的内容来实现此目的。
假设您有一个实体“客户”
public class Customer
{
public string Id { get; set; }
public string Name { get; set; }
public Address Address { get; set; }
public string PhoneNumber { get; set; }
public string Email { get; set; }
}
并且您只想加载Id和Name属性,您可以定义Results Transformer:
public class CustomerNameTransformer : AbstractTransformerCreationTask<Customer>
{
public CustomerNameTransformer()
{
TransformResults = results => from customer in results
select new CustomerNameViewModel
{
Id = customer.Id,
Name = customer.Name
};
}
}
和您的“视图模型”:
public class CustomerNameViewModel
{
public string Id { get; set; }
public string Name { get; set; }
}
通过这种方式,您可以通过多种方式将“客户”实体作为“客户名称ViewModel”进行访问:
//Load and transform by one id
CustomerNameViewModel viewModel = session.Load<CustomerNameTransformer, CustomerNameViewModel>("customers/1");
//Load and transform by several id's
CustomerNameViewModel[] viewModels = session.Load<CustomerNameTransformer, CustomerNameViewModel>(new[]{ "customers/1", "customers/2"});
//Query and transform
List<CustomerNameViewModel> viewModels = session.Query<Customer>()
.TransformWith<CustomerNameTransformer, CustomerNameViewModel>()
.ToList();
结果变换器在数据返回到客户端之前在服务器端执行。它们由在服务器上创建索引定义的相同IndexCreation任务创建。
您可以在文档中阅读有关结果变形金刚的更多信息:
希望这有帮助!