2

C# Asp.Net 内で RavenDB を使用していますが、サブ コレクション内の値で注文する OrderBy の適用に問題があります。私のモデルの基本的な例は次のとおりです。

public class Record
{
    public string Id { get; set; }

    public string Name {get; set; }

    public Field[] Fields { get; set; }
}

public class Field
{
    public string Name { get; set; }

    public string Value { get; set; }
}

これは RavenDB に次のように保存されます

{
   "Name": "A Name Of Somesort"
   "Fields": [
       {
          "Name": "Colour",
          "Value": "Red"
       },
       {
          "Name": "Size",
          "Value": "Large"
       }
   ]
}

これらの大量のレコードがデータベースに保存されていると想像すると、このデータのページを次のように取得できます

using (var session = documentStore.OpenSession("TestDB"))
{
    var result = session.Query<Record>().Skip(0).Take(10).ToList();
}

私がやりたいことは、フィールド値に基づいてレコードをソートできるようにすることです (たとえば、「色」という名前のフィールドの値でレコードをソートします)

編集:

さらに説明するために、私が達成したいことは以下のようなものですが、これは RavenDB では許可されていないため、別の方法を見つける必要があります (可能であれば)。

using (var session = documentStore.OpenSession("TestDB"))
{
    var result = session.Query<Record>()
                .OrderBy(v => v.Fields.First(f => f.Name == "Colour").Value)
                .Skip(0)
                .Take(10)
                .ToList();
}

これにより、次のメッセージとともに新しい ArgumentException がスローされます

Invalid computation: v.Fields.First(f => (f.Name == "Colour")).Value. You cannot use computation (only simple member expression are allowed) in RavenDB queries.
4

2 に答える 2

3

それで、私はこれを機能させることができたので、私がそれをどのように行ったかを共有するだけです.

以下のような新しいインデックスを作成する必要がありました

public class Record_ByField : AbstractIndexCreationTask<Record>
{
    public Record_ByField()
    {
        Map = records=> from r in records
                          select new
                          {
                              _ = r.Fields
                                 .Select(field =>
                                     CreateField(field.Name, field.Value, false, true))
                          };
    }
}

これは、LuceneQuery を使用してフィールド値 (この例では、カラー フィールドの値) に対して OrderBy を実行できることを意味します。

var result = session.Advanced.LuceneQuery<Record>("Record/ByField")
            .OrderBy("+Colour")
            .Skip(0)
            .Take(10)
            .ToList();

降順で並べ替えるには、+ プレフィックスを - プレフィックス (-Colour) に置き換え、任意のフィールド名をこの Order By に渡すことができます。

特定のデータベースにインデックスをプログラム的にインストールする方法については、「プログラムによるインデックスの作成」を参照してください。

動的インデックスについては、http://ravendb.net/docs/2.0/client-api/advanced/dynamic-fieldsを参照してください。

于 2013-07-18T10:08:52.300 に答える