如何查询TIndexCreator

时间:2013-03-09 04:37:16

标签: ravendb

我创建了这个索引:

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索引进行查询?

1 个答案:

答案 0 :(得分:2)

Raven对几乎所有涉及匹配查询到索引的内容都做了Duck Typing。您需要的只是一个包含您要查询的字段的类型:

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来鸭子类型到包含所有字段的类。