我有一个名为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索引来处理该集合,但我们仍然非常模糊它们的工作方式。想法?
答案 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>()); }
}
}