RavenDB - 计算属性

时间:2014-09-05 08:11:49

标签: ravendb

我有一个包含一些计算属性的文档。没有setter的属性,可以在我的类上调用其他方法来返回结果,例如:

public class Order
{
    public string CustomerId { get; set; }

    public string VehicleId { get; set; }

    public DateTime OrderDate { get; set; }

    public decimal CommissionPercent { get; set; }

    public List<OrdersLines> OrderLines { get; set; }

    public decimal Total
    {
        get { return GetOrderLinesTotal() + SomeDecimal + AnotherDecimal; }
    }

    public decimal GetOrderLinesTotal()
    {
        return OrderLines.Sum(x => x.Amount);
    }
}

我使用一个简单的索引来搜索客户订单,日期和使用lucene查询的Vehicle文档中的一些属性以及用于创建我的视图模型的Transformer。我查看了脚本索引结果,我不确定它是否适用于这种情况。

public class ViewModel
{
    public string OrderId { get; set; }
    public string CustomerName { get; set; }
    public string VehicleName { get; set; }
    public string Total { get; set; }
}

当我查询这些文档时,如何从Total属性中获取计算值?

我已经将GetOrderLinesTotal简化了一些,实际上它是一种复杂的方法,在计算总数时需要考虑很多其他属性。

我只获得在创建或更新文档时序列化的计算值。

2 个答案:

答案 0 :(得分:2)

我意识到这更像是一个文档设计问题而不是试图做一些RavenDB不应该做的事情。我简化了我的文档并使用map / reduce来解决问题。

答案 1 :(得分:1)

我认为你的情况类似于我曾经遇到的问题。我在公共 get 属性上使用JsonIgnore属性,并使用私有支持字段,我使用JsonProperty属性将其包含在序列化中。你应该能够应用类似的想法:

/// <summary>
/// The <see cref="Team" /> class.
/// </summary>
public class Team
{
    /// <summary>
    /// The ids of the users in the team.
    /// </summary>
    [JsonProperty(PropertyName = "UserIds")]
    private ICollection<string> userIds;

    // ...[snip]...

    /// <summary>
    /// Gets the ids of the users in the team.
    /// </summary>
    /// <value>
    /// The ids of the users in the team.
    /// </value>
    [JsonIgnore]
    public IEnumerable<string> UserIds
    {
        get { return this.userIds; }
    }

    // ...[snip]...
}