我是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中的索引字段过滤事务。
提前致谢。对不起我的英语,这不是我的母语。
答案 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 )
现在一切正常。