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

Getting only a part of a specific Ravendb document

是否可以只加载 Ravendb 文档的一部分。 我想通过 id 获取文档,但应该只获取一些字段。 我知道我可以将 session.QuerySelect 调用一起使用,但是我无法查询文档的 ID,因此我必须改用 session.Load,但这会获取整个文档. 我需要为此创建索引吗?

您可以使用名为 Results Transformers 的东西来实现此目的。

假设你有一个实体"Customer"

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 和名称 属性,您定义了一个结果转换器:

public class CustomerNameTransformer : AbstractTransformerCreationTask<Customer>
{
    public CustomerNameTransformer()
    {
        TransformResults = results => from customer in results
                                      select new CustomerNameViewModel
                                      {
                                          Id = customer.Id,
                                          Name = customer.Name
                                      };
    }
}

和你的 "view model":

public class CustomerNameViewModel
{
    public string Id { get; set; }
    public string Name { get; set; }
}

有了这个,您可以通过多种方式将客户实体作为 "Customer Name 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

希望对您有所帮助!