【问题标题】:RavenDB query not rehydrating enumerable propertyRavenDB 查询不补充可枚举属性
【发布时间】:2013-01-06 14:07:19
【问题描述】:

我有一个名为Campaign 的域对象,其中包含一些字符串属性和TrackingEntry 对象的集合。每当我从文档会话中检索查询时,此属性为空,即使我至少保存了一个跟踪条目。如何检索活动对象以便同时检索跟踪条目集合?这是Campaign的相关代码:

public class Campaign : Entity
{
    private ICollection<TrackingEntry> trackingEntries;

    public string BrandId { get; set; }

    public ICollection<TrackingEntry> TrackingEntries
    {
        get { return trackingEntries ?? (trackingEntries = new Collection<TrackingEntry>()); }
    }
}

有问题的方法采用逗号分隔的品牌 ID 字符串,检索具有这些品牌 ID 的所有广告系列,循环并根据跟踪条目集合的内容执行一些自定义逻辑等。以下是相关部分:

        var brandIds = input.Split(',');
        var campaigns = session.Query<Campaign>().Where(x => x.BrandId.In(brandIds));
        foreach (var campaign in campaigns)
        {
            DateTime? dateClaimed = null;
            var trackingEntry = campaign.TrackingEntries.FirstOrDefault(x => x.ConsumerId == consumer.Id);
            if (trackingEntry != null)
            {
                dateClaimed = trackingEntry.CreatedOn;
            }
        }

我知道有一个跟踪条目,但设置断点会显示一个空集合。我认为这可能是 raven 缓存和过时的索引,但在将记录写入数据库 24 小时后问题仍然存在。我在想我可能需要一个 map-reduce 索引来处理该集合,但对它们的工作方式仍然很模糊。想法?

【问题讨论】:

    标签: c#-4.0 collections ravendb


    【解决方案1】:

    唯一的问题在于您设置属性的方式。默认情况下,私有字段不会序列化,公共属性只有在定义了 setter 时才会反序列化。设置器本身可以是公共的或私有的。如果您担心初始化列表,只需在构造函数中执行即可。

    这是最简单的方法:

    public class Campaign : Entity
    {
        public Campaign()
        {
            TrackingEntries = new Collection<TrackingEntry>();
        }
    
        public string BrandId { get; set; }
    
        public ICollection<TrackingEntry> TrackingEntries { get; private set; }
    }
    

    同样适用于任何集合类型。 (数组、列表、可枚举等)

    另一种方法是通过归因。但我认为第一种方法更好,因为它使您的实体没有依赖关系,并且更易于阅读。

    public class Campaign : Entity
    {
        [JsonProperty("TrackingEntries")]
        private ICollection<TrackingEntry> trackingEntries;
    
        public string BrandId { get; set; }
    
        [JsonIgnore]
        public ICollection<TrackingEntry> TrackingEntries
        {
            get { return trackingEntries ?? (trackingEntries = new Collection<TrackingEntry>()); }
        }
    }
    

    【讨论】:

    • 当您与 Raven 交互时,我完全忽略了您正在序列化和反序列化 json 的事实 - 感谢 Matt,已修复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 2012-05-03
    • 2017-12-05
    • 2018-12-18
    • 1970-01-01
    • 2012-07-26
    相关资源
    最近更新 更多