2

RavenDB に次のようなドキュメントがあります。

{
    "ItemId": 1,
    "Title": "Villa
}

次のメタデータを使用:

Raven-Clr-Type: MyNamespace.Item, MyNamespace
Raven-Entity-Name: Doelkaarten

そのため、タイプ MyNamespace.Item でシリアライズしましたが、独自の Raven-Entity-Name を付けたので、独自のコレクションを取得します。

私のコードでは、インデックスを定義します。

public class DoelkaartenIndex : AbstractIndexCreationTask<Item>
{
    public DoelkaartenIndex()
    {
        // MetadataFor(doc)["Raven-Entity-Name"].ToString() == "Doelkaarten"
        Map = items => from item in items
                       where MetadataFor(item)["Raven-Entity-Name"].ToString() == "Doelkaarten"
                       select new {Id = item.ItemId, Name = item.Title};
    }
}

インデックスでは、「マップ」フィールドで次のように翻訳されています。

docs.Items
.Where(item => item["@metadata"]["Raven-Entity-Name"].ToString() == "Doelkaarten")
.Select(item => new {Id = item.ItemId, Name = item.Title})

インデックスに対するクエリでは、結果が得られません。

Maps フィールドを以下のコードに手動で変更すると、機能します...

from doc in docs
where doc["@metadata"]["Raven-Entity-Name"] == "Doelkaarten"
select new { Id = doc.ItemId, Name=doc.Title };

必要な結果を与えるインデックスをコードで定義するにはどうすればよいですか?

使用した RavenDB: RavenHQ、ビルド #961

アップデート:

私がやっていることは次のとおりです。SharePoint を CMS として使用し、RavenDB を SharePoint リスト データのすぐに使用できる複製として使用したいと考えています。SharePoint リストから RavenDB に同期するためのツールを作成しました。SharePoint リスト アイテムから作成し、RavenDB にシリアル化するジェネリック タイプのアイテムがあります。したがって、すべてのドキュメントはアイテム型です。しかし、それらは異なるプロパティを持つ異なるリストに由来するため、区別できるようにしたいと考えています。追加のプロパティで差別化を提案すると、これは完全に機能します。しかし、その後、すべてのリストのすべてのリスト アイテムが 1 つの大きな Items コレクションに表示されます... この問題に対する最善のアプローチは何だと思いますか? それともそれと一緒に暮らすだけですか?インデックスを使用して、アイテム内のすべてのデータから必要な実際のデータへの射影を作成したいと考えています。

4

1 に答える 1

1

この方法でコレクションの名前を簡単に変更することはできません。サーバー側はRaven-Entity-Nameメタデータを使用しますが、クライアント側はドキュメントストアに登録されている規則を介してコレクション名を決定します。デフォルトの規則では、エンティティのタイプ名を使用します。

新しい関数をDocumentStore.Conventions.FindTypeTagName-に割り当てることで、独自のカスタム規則を提供できますが、すべてのエンティティに対してそれを行うのはおそらく面倒です。エンティティに適用するカスタム属性を作成してから、その属性を探して理解するための関数を作成できます。

Doelkaarten本当に最も簡単な方法は、の代わりにエンティティを呼び出すことですItem

インデックスの変更が機能する理由については、linq構文の切り替えによるものではありません。from doc in docsの代わりに言ったからですfrom doc in docs.Itemsfrom doc in docs.Doelkaartenswhere句を使用する代わりに、おそらく実行できたはずです。それらは同等です。その他の例については、ドキュメントのこのページを参照してください。

于 2012-12-05T00:58:29.457 に答える