C# 使用LINQ和RavenDB对预定义过滤器进行嵌套排序
我对这个问题的适当标题有疑问,因为我想解决一个有趣的排序问题 因此,我定义了3个user{skill:level}类型的对象: 现在我想根据所选技能的总和对用户a、b和c进行排序。选择的技能是s1和s2。我不在乎s3 过滤器[s1,s2]的有序结果应为[c,b,a],因为 我已经为这种情况定义了类:C# 使用LINQ和RavenDB对预定义过滤器进行嵌套排序,c#,linq,ravendb,C#,Linq,Ravendb,我对这个问题的适当标题有疑问,因为我想解决一个有趣的排序问题 因此,我定义了3个user{skill:level}类型的对象: 现在我想根据所选技能的总和对用户a、b和c进行排序。选择的技能是s1和s2。我不在乎s3 过滤器[s1,s2]的有序结果应为[c,b,a],因为 我已经为这种情况定义了类: class Skill { public string Name { get; set; } public int Level { get; set; } } class User
class Skill
{
public string Name { get; set; }
public int Level { get; set; }
}
class User
{
public string Name { get; set; }
public IList<Skill> Skills { get; set; }
}
我想使用linq和ravendb来实现这一点。显然,我不想将数据库中的所有数据都加载到内存中,然后再进行神奇的排序之类的工作。我想我需要用map reduce创建一些疯狂的索引,然后对这些索引进行一些linq查询,等等。。。帮忙
顺便说一句:我使用的是RavenDB-Build960
编辑:
不幸的是,我的临时解决方法是将所有用户数据读入内存并使用linq to对象,因为raven linq驱动程序存在相关问题,该驱动程序不支持查询期间的计算:
var selected = users.OrderByDescending(user =>
user.Skills
.Where(skill => filters.Contains(skill.Name))
.Select(skill => skill.Level)
.Sum());
创建一个索引,在索引时进行此求和,并公开结果
from user in docs.Users
select new
{
Skills_Sum = user.Skills.Sum(x=>x.Level)
}
创建一个索引,在索引时进行此求和,并公开结果
from user in docs.Users
select new
{
Skills_Sum = user.Skills.Sum(x=>x.Level)
}
谢谢,这是正确的,虽然我有对象,但当我想使用raven linq驱动程序获取结果时,我得到了错误,因为RavenDB不允许在查询期间进行计算,只允许在索引期间进行计算。考虑将操作移到索引。谢谢,它是正确的,而我有对象,但是当我想用RaveLINQ驱动程序获取结果时,我得到了错误,因为RavenDB不允许在查询期间计算,计算只允许在索引期间。谢谢,我在考虑这样的索引,但是我必须考虑用户实际需要的随机技能的总和,而不是所有技能的总和。我是否需要以某种方式创建所有总和的组合?我的临时解决方案是将数据加载到内存中,并使用类似于Servy所示的linq to objects表达式。谢谢,我考虑了这样的索引,但我必须考虑用户实际需要的随机技能的总和,而不是所有技能的总和。我是否需要以某种方式创建所有总和的组合?我的临时解决方案是将数据加载到内存中,并使用类似于Servy所示的linq to objects表达式。
var users = new List<User> {a, b, c};
var filters = new List<string> { "s1", "s2" };
var selected = users.Magic(); // which results in [c,b,a]
var selected = users.OrderByDescending(user =>
user.Skills
.Where(skill => filters.Contains(skill.Name))
.Select(skill => skill.Level)
.Sum());
var query = users.OrderBy(user =>
user.Skills
.Where(skill => skill.Name == "s1" || skill.Name == "s2")
.Select(skill => skill.Level)
.Sum());
from user in docs.Users
select new
{
Skills_Sum = user.Skills.Sum(x=>x.Level)
}