2

解決したい興味深いソートの問題があるため、この質問に適切なタイトルを付けるのに問題がありました。

したがって、 type の 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 }

次に、ユーザーを並べ替え、a選択bcたスキルの合計で並べ替えます。セレクトスキルは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を使用しています-ビルド#960

編集:

私の一時的な回避策は、残念ながら、すべてのユーザー データをメモリに読み込み、linq-to-objects を使用することです (クエリ中の計算をサポートしない raven linq ドライバーに関連する問題のため)。

var selected = users.OrderByDescending(user =>
                                user.Skills
                                    .Where(skill => filters.Contains(skill.Name))
                                    .Select(skill => skill.Level)
                                    .Sum());
4

2 に答える 2

0

インデックス作成時にこの合計を行うインデックスを作成し、結果を公開します

from user in docs.Users
select new
{
    Skills_Sum = user.Skills.Sum(x=>x.Level)
}
于 2012-08-22T07:17:29.603 に答える
0
var query = users.OrderBy(user => 
    user.Skills
    .Where(skill => skill.Name == "s1" || skill.Name == "s2")
    .Select(skill => skill.Level)
    .Sum());
于 2012-08-21T14:42:02.770 に答える