RavenDB查询没有重新润现可枚举的属性

时间:2013-01-06 14:07:20

标签: c#-4.0 collections ravendb

我有一个名为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;
            }
        }

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

1 个答案:

答案 0 :(得分:3)

唯一的问题在于您设置属性的方式。默认情况下,私有字段不是序列化的,如果定义了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>()); }
    }
}