代码之家  ›  专栏  ›  技术社区  ›  JCoder23

RavenDB-计算财产

  •  3
  • JCoder23  · 技术社区  · 10 年前

    我有一个带有一些计算财产的文档。没有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);
        }
    }
    

    我使用一个简单的索引来搜索Orders by customer、date和Vehicle文档上的一些财产,使用lucene查询和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 回复  |  直到 10 年前
        1
  •  2
  •   JCoder23    10 年前

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

        2
  •  1
  •   Adrian Thompson Phillips    10 年前

    我认为你的情况与我曾经遇到的问题类似。我使用 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]...
    }