gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:27:34 24 4
gpt4 key购买 nike

我在为这个问题选择合适的标题时遇到了问题,因为我有一个有趣的排序问题想要解决。

因此,我定义了 3 个类型为 user { skill: level } 的对象:

a { s1: 1, s2: 2, s3: 4 }
b { s1: 2, s2: 2, s3: 4 }
c { s1: 1, s2: 5, s3: 9 }

现在我想根据所选技能的总和对用户 abc 进行排序。选择的技能是s1s2。我不关心 s3

过滤器 [s1,s2] 的排序结果应该是 [c,b,a] 因为

s1 + s2 for c = 6, 
b = 4,
a = 3

我已经为这种情况定义了类:

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; }
}

并初始化它:

var a = new User
{
Name = "a",
Skills = new List<Skill>
{
new Skill {Name = "s1", Level = 1},
new Skill {Name = "s2", Level = 2},
new Skill {Name = "s3", Level = 4}
}
};
var b = new User
{
Name = "b",
Skills = new List<Skill>
{
new Skill {Name = "s1", Level = 2},
new Skill {Name = "s2", Level = 2},
new Skill {Name = "s3", Level = 4}
}
};
var c = new User
{
Name = "c",
Skills = new List<Skill>
{
new Skill {Name = "s1", Level = 1},
new Skill {Name = "s2", Level = 5},
new Skill {Name = "s3", Level = 9}
}
};

下面是我要用于排序的用户列表和技能列表:

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]

我想使用 linq 和 ravendb 来做到这一点。显然我不想将数据库中的所有数据加载到内存中,然后进行魔术排序之类的事情。我想我需要用 map reduce 创建一些疯狂的索引,然后对这些索引进行一些 linq 查询等等...帮助?

顺便说一句:我正在使用 RavenDB - Build #960

编辑:

不幸的是,我的临时解决方法是将所有用户数据读入内存并使用 linq-to-objects(因为与 raven linq 驱动程序相关的问题,它不支持查询期间的计算):

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

关于c# - 使用 LINQ 和 RavenDB 对预定义过滤器进行嵌套排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12057272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com