我在ProductFamily(父级)和下属列表(SaleItem)之间具有父级/子级关系。我正在本地运行Ravendb Server,并将该服务器作为控制台应用程序启动。当查询“家庭”数据时,我试图在会话中包括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());
                }
            }
        }


在逐步执行代码时,我看到在行上获取Get Saleitems列表的调用:

fam.SaleItems = session.Load<SaleItem>(fam.SaleitemIds).ToList();


我相信我实施了一些错误的东西,但是对于这个平台,我已经足够陌生了,可以接受我可能只是误解了行为。肯定在某些情况下,我不希望将Saleitem文档嵌入到Family文档中,因此在这种情况下,这并不是真正的选择。

最佳答案

道格
查看您包括的内容:

  o.Include<SaleItem>(s => s.Id)


您可能希望它是:

  o.Include<SaleItem>(s => s.SaleitemIds )

关于c# - RavenDB包括仍然往返以加载包含的数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10744822/

10-12 20:52