2

ProductFamily(親)と部下のリスト(SaleItem)の間に親子関係があります。サーバーをコンソールアプリとしてプルアップした状態で、Ravendbサーバーをローカルで実行しています。ファミリデータをクエリするとき、サーバーへの余分な移動を避けるために、セッションにSaleItemsのリストを含めようとしています。ただし、コンソールでは、foreachループをステップ実行するときに、各ファミリの個別のセールアイテムリストをロードするための後続の呼び出しが表示されます。私は何か間違ったことをしていると思います、そしてそれが何であるかについて困惑しています。私は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());
                }
            }
        }

コードをステップスルーすると、次の行にあるセールアイテムのリストを取得するための呼び出しが表示されます。

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

私は何かを間違って実装したと思いますが、このプラットフォームは十分に新しいので、動作がどうなるかを単に誤解している可能性があることを受け入れます。SaleitemドキュメントをFamilyドキュメントに埋め込みたくない場合があるので、この場合は実際にはオプションではありません。

4

1 に答える 1

2

Doug_w、あなたが含んでいるものを見てください:

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

あなたはおそらくそれをしたいでしょう:

  o.Include<SaleItem>(s => s.SaleitemIds )
于 2012-05-25T11:46:14.243 に答える