仅获取特定Ravendb文档的一部分

时间:2015-03-17 11:59:36

标签: c# ravendb

是否可以仅加载Ravendb文档的一部分。 我想通过id获取文档,但只应提取一些字段。 我知道我可以session.Query使用Select调用,但后来我无法查询文档的ID,所以我必须使用session.Load代替,但这会获取整个文档。 我需要为此创建一个索引吗?

1 个答案:

答案 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任务创建。

您可以在文档中阅读有关结果变形金刚的更多信息:

http://ravendb.net/docs/article-page/2.5/csharp/client-api/querying/results-transformation/result-transformers

希望这有帮助!