RavenDB按索引字段选择文档

时间:2012-08-13 17:52:08

标签: c# nosql ravendb

我是RaveDB的新手(实际上我昨天才开始学习它)。并尝试实现一些功能。

让我们有下一个类层次结构:

public abstract class Transaction
{
    public string Id { get; set; }
}

public class CategoryTransaction : Transaction
{
    public string AccountId { get; set; }

    public string Name { get; set; }

    public string Category { get; set; }

    public decimal Amount { get; set; }
}

public class ExchangeTransaction : Transaction
{
    public string DebitAccountId { get; set; }

    public string CreditAccountId { get; set; }

    public decimal DebitAmount { get; set; }

    public decimal CreditAmount { get; set; }
}

存储优秀的int db的所有内容。我将商店文档的Conventions = FindTypeTagName ...添加为'transactions / *'文档ID。

但我想为特定账户选择所有交易创建索引(按字段AccountId)。我创建了索引:

public class AccountTransactionResult
{
    public string AccId { get; set; }
}

public class Account_Transactions : AbstractMultiMapIndexCreationTask<AccountTransactionResult>
{
    public Account_Transactions()
    {
        this.AddMap<CategoryTransaction>( transactions => from transaction in transactions
                                                            select new
                                                                    {
                                                                    AccId = transaction.AccountId
                                                                    } );
        this.AddMap<ExchangeTransaction>( transactions => from transaction in transactions
                                                            select new
                                                                    {
                                                                    AccId = transaction.DebitAccountId
                                                                    } );
        this.AddMap<ExchangeTransaction>( transactions => from transaction in transactions
                                                            select new
                                                                    {
                                                                    AccId = transaction.CreditAccountId
                                                                    } );
    }
}

此索引运行良好我无法将数据库(Exchange和类别)中的所有类型的事务作为单个IEnumerable<Transaction>获取。那很好。

但我想使用索引仅为特定帐户返回交易。因为ExchangeTransaction可以属于两个Accounts。我希望ExchangeTransaction同时看到Accounts。我可以通过AccId(索引字段)在Raven Studio中进行查询,它的工作原理很棒!但是我无法在代码中创建相同的请求:(。

有人能帮助我吗?如何在C#LINQ查询中使用索引字段AccId?

此代码

var query = session.Query<Transaction, Account_Transactions>()

返回所有类型的事务,但我不知道如何按DB中的索引字段过滤事务。

提前致谢。对不起我的英语,这不是我的母语。

1 个答案:

答案 0 :(得分:2)

我的错,在documentation的每一件事都很清楚。我错过了一些有用的段落。

  

最简单的方法是编写这样的多地图索引   之一:

public class AnimalsIndex : AbstractMultiMapIndexCreationTask
{
    public AnimalsIndex()
    {
        AddMap<Cat>(cats => from c in cats
                            select new { c.Name });

        AddMap<Dog>(dogs => from d in dogs
                            select new { d.Name });
    }
}
     

并像这样查询:

var results = session.Advanced.LuceneQuery<object>("AnimalsIndex")
    .WhereEquals("Name", "Mitzy");

&GT;

在我的情况下,我应该使用下一个结构:

var transactions = session.Advanced.LuceneQuery<Transaction>( "Account/Transactions" )
                    .WhereEquals( "AccId", account2.Id )

现在一切正常。