组和顺序,select 来自 c# 中 ravendb 的详细信息
Group and order , select details from ravendb in c#
public class Award
{
public int Id { get; set; }
public string Awardor { get; set; }
public double Amount { get; set; }
public string Awardee { get; set; }
}
输入保存在 ravendb 中:
1 DOT 1000 YSI
2 DOJ 5000 PSI
3 DOA 6000 YSI
4 DOT 2000 PPP
5 DOT 1000 YSI
6 DOA 4000 PSI
我想要这样的输出
最高奖获得者
DOA 10000
DOJ 5000
DOT 4000
最高获奖者
PSI 9000
YSI 8000
PPP 2000
如何使用 C# 创建索引并在 raven db 中查询它以按获奖者和获奖者按金额分组获取前 10 名奖项
这可行(考虑更改属性名称):
public class AwardIndex : Raven.Client.Indexes.AbstractMultiMapIndexCreationTask<AwardIndex.Result>
{
public class Result
{
public string AwardeeAwardor { get; set; } //is Awardee or Awardor
public string ItemType { get; set; } //DOT, DOJ, PSI, ecc
public double Value { get; set; }
}
public AwardIndex()
{
AddMap<Award>(items => from item in items
select new Result
{
AwardeeAwardor = "Awardee",
ItemType = item.Awardee,
Value = item.Amount
});
AddMap<Award>(items => from item in items
select new Result
{
AwardeeAwardor = "Awardor",
ItemType = item.Awardor,
Value = item.Amount
});
Reduce = items => from item in items
group item by new { AwardeeAwardor = item.AwardeeAwardor, ItemType = item.ItemType }
into g
select new Result
{
AwardeeAwardor = g.Key.AwardeeAwardor,
ItemType = g.Key.ItemType,
Value = g.Sum(x => x.Value)
};
}
}
查询:
IList<AwardIndex.Result> results = session
.Query<AwardIndex.Result, AwardIndex>()
.OrderByDescending(x => x.Value)
.Take(10)
.ToList(); // do what you need
var awardor = results.Where(x => x.AwardeeAwardor == "Awardor").OrderByDescending(x => x.Value).ToList();
var awardee = results.Where(x => x.AwardeeAwardor == "Awardee").OrderByDescending(x => x.Value).ToList();
awardor.ForEach(x => Console.WriteLine(x.AwardeeAwardor + "\t" + x.ItemType + "\t" + x.Value));
Console.WriteLine("_____");
awardee.ForEach(x => Console.WriteLine(x.AwardeeAwardor + "\t" + x.ItemType + "\t" + x.Value));
public class Award
{
public int Id { get; set; }
public string Awardor { get; set; }
public double Amount { get; set; }
public string Awardee { get; set; }
}
输入保存在 ravendb 中:
1 DOT 1000 YSI
2 DOJ 5000 PSI
3 DOA 6000 YSI
4 DOT 2000 PPP
5 DOT 1000 YSI
6 DOA 4000 PSI
我想要这样的输出
最高奖获得者
DOA 10000
DOJ 5000
DOT 4000
最高获奖者
PSI 9000
YSI 8000
PPP 2000
如何使用 C# 创建索引并在 raven db 中查询它以按获奖者和获奖者按金额分组获取前 10 名奖项
这可行(考虑更改属性名称):
public class AwardIndex : Raven.Client.Indexes.AbstractMultiMapIndexCreationTask<AwardIndex.Result>
{
public class Result
{
public string AwardeeAwardor { get; set; } //is Awardee or Awardor
public string ItemType { get; set; } //DOT, DOJ, PSI, ecc
public double Value { get; set; }
}
public AwardIndex()
{
AddMap<Award>(items => from item in items
select new Result
{
AwardeeAwardor = "Awardee",
ItemType = item.Awardee,
Value = item.Amount
});
AddMap<Award>(items => from item in items
select new Result
{
AwardeeAwardor = "Awardor",
ItemType = item.Awardor,
Value = item.Amount
});
Reduce = items => from item in items
group item by new { AwardeeAwardor = item.AwardeeAwardor, ItemType = item.ItemType }
into g
select new Result
{
AwardeeAwardor = g.Key.AwardeeAwardor,
ItemType = g.Key.ItemType,
Value = g.Sum(x => x.Value)
};
}
}
查询:
IList<AwardIndex.Result> results = session
.Query<AwardIndex.Result, AwardIndex>()
.OrderByDescending(x => x.Value)
.Take(10)
.ToList(); // do what you need
var awardor = results.Where(x => x.AwardeeAwardor == "Awardor").OrderByDescending(x => x.Value).ToList();
var awardee = results.Where(x => x.AwardeeAwardor == "Awardee").OrderByDescending(x => x.Value).ToList();
awardor.ForEach(x => Console.WriteLine(x.AwardeeAwardor + "\t" + x.ItemType + "\t" + x.Value));
Console.WriteLine("_____");
awardee.ForEach(x => Console.WriteLine(x.AwardeeAwardor + "\t" + x.ItemType + "\t" + x.Value));