解決したい興味深いソートの問題があるため、この質問に適切なタイトルを付けるのに問題がありました。
したがって、 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
選択b
しc
たスキルの合計で並べ替えます。セレクトスキルはs1
とs2
です。私は気にしません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());