我在ProductFamily(父级)和下级列表(SaleItem)之间有父/子关系。我在本地运行Ravendb服务器,服务器被拉出作为控制台应用程序。当我查询Family数据时,我试图在会话中包含SaleItems列表,以避免额外访问服务器。但是在控制台上,当我逐步执行foreach循环时,我看到后续调用为每个系列加载单个saleitem列表。我认为我做错了什么,并对它可能是什么感到困惑。我在使用RavenDB的第2天,所以任何手握都值得赞赏。
类:
public class Family
{
public string Id { get { return string.Format(@"Families/{0}", this.FamilyID); } }
public int FamilyID { get; set; }
public string FamilyNumber { get; set; }
public string Description { get; set; }
public string[] SaleitemIds { get; set; }
public override string ToString()
{
return string.Format("Number:{0} - {1}", FamilyNumber, Description);
}
[JsonIgnore]
public List<SaleItem> SaleItems { get; set; }
}
public class SaleItem
{
public string Id { get { return string.Format(@"SaleItems/{0}", this.SaleItemID); } }
public int SaleItemID { get; set; }
public string Description { get; set; }
public override string ToString()
{
return string.Format("Number:{0} - {1}", SaleItemID.ToString(), Description);
}
}
代码:
List<SearchTerm> searchterms = new List<SearchTerm>(){ new SearchTerm(){term="1009110922"}
,new SearchTerm(){term="1009112439"}
,new SearchTerm(){term="1009122680"}
,new SearchTerm(){term="1009124177"}
,new SearchTerm(){term="1009133928"}
,new SearchTerm(){term="1009135435"}
,new SearchTerm(){term="1009148000"}};
using (IDocumentSession session = documentStore.OpenSession())
{
var results = session.Query<Family>().Customize(o => o.Include<SaleItem>(s => s.Id)).Where(x => x.FamilyNumber.In(searchterms.Select(t => t.term).ToList()));
foreach (Family fam in results)
{
Console.WriteLine(fam.ToString());
fam.SaleItems = session.Load<SaleItem>(fam.SaleitemIds).ToList();
foreach (SaleItem si in fam.SaleItems)
{
Console.WriteLine(" " + si.ToString());
}
}
}
当我单步执行代码时,我看到了在线上获取Saleitems列表的调用:
fam.SaleItems = session.Load<SaleItem>(fam.SaleitemIds).ToList();
我相信我已经错误地实现了一些东西,但我对这个平台足够新,接受我可能只是误解了行为是什么。绝对有些情况下我不希望将Saleitem文档嵌入到Family文档中,因此在这种情况下这不是一个真正的选项。
答案 0 :(得分:2)
Doug_w, 看看你的内容:
o.Include<SaleItem>(s => s.Id)
你可能想要它:
o.Include<SaleItem>(s => s.SaleitemIds )