Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用LINQ和RavenDB对预定义过滤器进行嵌套排序_C#_Linq_Ravendb - Fatal编程技术网

C# 使用LINQ和RavenDB对预定义过滤器进行嵌套排序

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

我对这个问题的适当标题有疑问,因为我想解决一个有趣的排序问题

因此,我定义了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
{
    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)
}