1

このインデックスを作成しました:

public class ReceiptsByClient : AbstractIndexCreationTask<Receipt>
    {
        public ReceiptsByClient()
        {
            Map = receipts => from r in receipts
                              let d = LoadDocument<Debtor>(r.Receipt_Debtor)
                              select new { ClientId = d.Debtor_Client };
        }
    }

次のように、このインデックスに対してクエリを実行します。

var rptQry = Session.Query<Receipt, ReceiptsByClient>()

もちろん、Where 句で ClientId の値を渡せるようにしたいと考えています。ただし、where 句の T は Receipt 型であり、ReceiptsByClient で定義された匿名型の ClientId を認識していません。ReceiptsByClient インデックスを使用してクエリを実行するにはどうすればよいですか?

4

1 に答える 1

2

Raven は、クエリとインデックスの照合を含むほとんどすべての操作でダック タイピングを実行します。必要なのは、クエリを実行するフィールドを持つ型だけです。

public class Foo
{
    public string ClientId { get; set; }
}

次に、それをクエリで使用し、ダックタイプで戻してAs、結果が実際のクラスのものになるようにします。

var q = session.Query<Foo, ReceiptsByClient>()
               .Where(x=> x.ClientId == "clients/123")
               .As<Receipt>();

ClientIdフィールドは結果に含まれないことに注意してください。それをしたい場合は、フィールドをインデックスに保存し、クエリでStore(x=> x.ClientId, FieldStorage.Yes)使用AsProjectionして、すべてのフィールドを持つクラスにダックタイプする必要があります。

于 2013-03-09T05:29:51.300 に答える