2012-08-13 3 views
0

Je suis nouveau sur RaveDB (En fait, j'ai commencé à l'apprendre hier). Et essayez d'implémenter certaines fonctionnalités.RavenDB sélectionner des documents par champ d'index

Permet de nous la prochaine hiérarchie de classes:

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

Tout le stockage excelent int db. L'événement I ajoute Conventions = FindTypeTagName ... pour les documents de magasin en tant qu'ID de document 'transactions/*'. Mais je veux créer un index pour sélectionner toutes les transactions pour un compte spécifique (par champ AccountId). J'ai créer un index:

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

Cet indice fonctionne bien, je ne peux pas obtenir tous les types de transactions de DB (Exchange et catégorie) comme unique IEnumerable<Transaction>. C'est super.

Mais je veux utiliser l'index pour retourner des transactions uniquement pour un compte particulier. Parce que ExchangeTransaction peut appartenir à deux Accounts. Je veux voir ExchangeTransaction pour les deux Accounts. Je peux faire une requête dans Raven Studio par AccId (champ d'index) et ça fonctionne bien! Mais je ne peux pas créer la même demande dans le code :(.

Quelqu'un peut-il me aider? Comment puis-je utiliser le champ index ACCID dans la requête C# LINQ?

Ce code

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

retour tout type de transaction, mais je ne veux pas comment filtrer les transactions par champ d'index dans la base de données.

Merci à l'avance. Et s'il vous plaît me désolé mon anglais, ce n'est pas ma langue maternelle.

Répondre

2

Ma faute, dans documentation tout est clair. J'ai manqué un paragraphe utile.

La meilleure façon de le faire est d'écrire un indice multi-carte comme ce un:

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

Et interroger comme ceci:

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

>

Dans mon cas, je devrais utiliser la construction suivante:

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

Et tout fonctionne maintenant.

Questions connexes