0

私は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; }
}

優れたintdbを格納するすべて。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
                                                                    } );
    }
}

このインデックスはうまく機能します。DB(ExchangeおよびCategory)からすべてのタイプのトランザクションを単一として取得することはできませんIEnumerable<Transaction>。それは素晴らしい。

ただし、インデックスを使用して、特定のアカウントのトランザクションのみを返したいと思います。ExchangeTransaction2つに属することができるのでAccountsExchangeTransaction両方見たいですAccounts。Raven StudioでAccId(インデックスフィールド)を使用してクエリを実行できます。しかし、コードで同じリクエストを作成することはできません:(。

誰かが私を助けることができますか?C#LINQクエリでインデックスフィールドAccIdを使用するにはどうすればよいですか?

このコード

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

すべてのタイプのトランザクションを返しますが、DBのインデックスフィールドでトランザクションをフィルタリングする方法はありません。

前もって感謝します。そして、私の英語をごめんなさい、それは私の母国語ではありません。

4

1 に答える 1

2

私のせいです。ドキュメントではすべてが明確です。私はいくつかの有用な段落を逃しました。

これを行う最も簡単な方法は、次のようなマルチマップ インデックスを作成することです。

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");

>

私の場合、次の構成を使用する必要があります。

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

そして、すべてが今働いています。

于 2012-08-13T18:49:43.287 に答える