2012-08-13 79 views
0

我是RaveDB的新手(其實我只是在昨天才開始學習它)。並嘗試實現一些功能。RavenDB通過索引字段選擇文檔

讓我們有下一個類層次結構:

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分貝。我爲活動添加了Conventions = FindTypeTagName ...作爲「交易/ *」文檔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和類別)獲得所有類型的交易單IEnumerable<Transaction>。太棒了。

但我想使用該索引僅返回特定帳戶的交易。因爲ExchangeTransaction可以屬於兩個AccountsAccounts我希望看到ExchangeTransaction。我可以通過AccId(索引字段)在Raven Studio中進行查詢,並且它可以工作!但我不能在代碼中創建:(同樣的要求。

有人能幫助我嗎?我如何使用索引字段ACCID在C#中的LINQ查詢?

此代碼

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

回報所有類型的交易,但我不如何通過索引字段在數據庫中篩選交易。提前

謝謝,對不起,請我我的英語,這不是我的母語。

回答

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

>

在我的情況下,我應該使用下一個建設:

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

而且現在一切正常。