0

TransformResults機能を使用しようとしていますが、機能させることができません。この機能を完全に理解しているわけではありません。おそらく、この問題を解決する別の方法があります。私が欲しいのは、注文からのIDと、顧客と起業家からの電子メールアドレスです。私を正しい方向に導くことができるすべてのヒントに満足しています。これが私のコードです。

書類

public class OrderDocument

    public string Id {get; set }

    public EntrepreneurInfo EntrepreneurInfo { get; set; }

    public CustomerInfo CustomerInfo { get; set; }

    public OrderStatus CurrentOrderStatus { get; set; }
}

情報クラス

public class EntrepreneurInfo
{
    public string EntrepreneurDocumentId { get; set; }

    public string Number { get; set; }

    public string Name { get; set; }
}

public class CustomerInfo
{
    public string CustomerDocumentId { get; set; }

    public string Number { get; set; }

    public string Name { get; set; }
}

情報クラスは、それぞれ顧客と起業家のドキュメントのサブセットにすぎません。CustomerおよびEntrepreneurドキュメントは、EmailAddressプロパティを持つ基本クラス(AbstractOrganizationDocument)から継承します。

マイインデックス

public class OrdersApprovedBroadcastingData : 
    AbstractIndexCreationTask<OrderDocument, OrdersApprovedBroadcastingData.ReduceResult>
{
    public OrdersApprovedBroadcastingData()
    {
        this.Map = docs => from d in docs 
                           where d.CurrentOrderStatus == OrderStatus.Approved 
                            select new
                            {
                                Id = d.Id,
                                CustomerId = d.CustomerInfo.CustomerDocumentId,
                                EntrepreneurId = d.EntrepreneurInfo.EntrepreneurDocumentId
                            };

        this.TransformResults = (db, orders) => from o in orders
                let customer = db.Load<CustomerDocument>(o.CustomerId)
                let entrepreneur = db.Load<EntrepreneurDocument>(o.EntrepreneurId)
                select
                    new 
                        {
                            o.Id,
                            o.CustomerId,
                            CustomerEmail = customer.EmailAddress,
                            o.EntrepreneurId,
                            EntrepreneurEmail = entrepreneur.EmailAddress
                        };
    }

    public class ReduceResult
    {
        public string Id { get; set; }

        public string CustomerId { get; set; }

        public string CustomerEmail { get; set; }

        public string EntrepreneurId { get; set; }

        public string EntrepreneurEmail { get; set; }
    }
}

Raven Studioでこのインデックスの結果を見ると、IDを除くすべてのフィールドでnull値が取得されます。そして最後にここに私の質問があります。

クエリ

        var items =
            this.documentSession.Query<OrdersApprovedBroadcastingData.ReduceResult, OrdersApprovedBroadcastingData>()
                .Select(x => new OrdersToBroadcastListItem
                    {
                        Id = x.Id,
                        CustomerEmailAddress = x.CustomerEmail,
                        EntrepreneurEmailAddress = x.EntrepreneurEmail
                    }).ToList();
4

1 に答える 1

3

インデックスを次のように変更します。

public class OrdersApprovedBroadcastingData : AbstractIndexCreationTask<OrderDocument>
{
  public OrdersApprovedBroadcastingData()
  {
    Map = docs => from d in docs
                  where d.CurrentOrderStatus == OrderStatus.Approved
                  select new
                  {
                  };

    TransformResults = (db, orders) =>
      from o in orders
      let customer = db.Load<CustomerDocument>(o.CustomerInfo.CustomerDocumentId)
      let entrepreneur = db.Load<EntrepreneurDocument>(o.EntrepreneurInfo.EntrepreneurDocumentId)
      select new
        {
          o.Id,
          CustomerEmailAddress = customer.EmailAddress,
          EntrepreneurEmailAddress = entrepreneur.EmailAddress
        };
  }
}

結果クラスは、単純に射影の最終的な形式にすることができます。中間ステップは必要ありません。

public class Result
{
  public string Id { get; set; }
  public string CustomerEmailAddress { get; set; }
  public string EntrepreneurEmailAddress { get; set; }
}

したくない場合は、このクラスをインデックスにネストする必要はありません。どちらでも構いません。次のいずれかでクエリを実行できます。

var items = session.Query<Result, OrdersApprovedBroadcastingData>();

または

var items = session.Query<OrderDocument, OrdersApprovedBroadcastingData>().As<Result>();

ただし、最初の方法では、慣習として結果クラスをネストする傾向があるため、実際には

var items = session.Query<OrderDocument.Result, OrdersApprovedBroadcastingData>();

インデックス マップには、プロパティをまったく含めていないことに注意してください。あなたが求めたものには何も必要ありません。ただし、クエリに Where または OrderBy 句を追加する場合は、フィルター処理または並べ替えを行う可能性のあるフィールドをそこに配置する必要があります。

最後にもう 1 つ - OrderDocument、CustomerDocument、EntrepreneurDocument で使用している規則は少し奇妙です。通常の慣例は、注文、顧客、起業家です。ドキュメントは、エンティティ自体の永続化された形式と考えてください。使用している規則は機能しますが、通常使用されるものではありません。

于 2012-10-10T16:07:09.217 に答える