2

最後に使用された合計と最大の呼び出しと使用回数が間違っています。それらは常に、現在 0 に設定されている 2 番目のマップ値に格納されている値です。-100 にすることができ、それが削減結果になります。配列にするべきだと誰かが言っているのに気づきましたが、それがどのように役立つかわかりません。2 つのマップが結合されていると仮定して適切に機能する map/reduce を使用して、オブジェクトに対する linq 式があります。

ここにデータがあります=> https://gist.github.com/940ccca1b0f8917e9eaf

次のようなクエリをサポートしたい

        var stats = Session.Query<MultiMapApiKeyStats.ApiKeyStats, MultiMapApiKeyStats>()
            .Customize(x => x.WaitForNonStaleResultsAsOfNow())
            .Where(x => x.AccountId == Account.Id)
            .OrderBy(x => x.Key).ToList();

次のようなテーブルを作成します テーブル

 public MultiMapApiKeyStats()
        {
            AddMap<KeyUsageBase>(uses => from use in uses
                                         select new
                                         {
                                             AccountId = use.AccountId,
                                             ApiKeyId = use.ApiKeyId,
                                             Key = (string)null,
                                             UsageCount = 1,
                                             LastUsed = use.LastUsedTicks,
                                             Pattern = (string)null,
                                             Status = ApiKey.KeyStatus.None,
                                             Type = ApiKey.ApplicationType.None
                                         });
            AddMap<ApiKey>(keys => from key in keys
                                   select new
                                          {
                                              AccountId = key.AccountId,
                                              ApiKeyId = key.Id,
                                              Key = key.Key,
                                              UsageCount = 0,
                                              LastUsed = 0,
                                              Pattern = key.Pattern,
                                              Status = key.ApiKeyStatus,
                                              Type = key.Type
                                          });


            Reduce = results => from result in results
                                group result by result.ApiKeyId
                                    into g
                                    select new
                                           {
                                           AccountId = g.Select(x => x.AccountId).FirstOrDefault(),
                                           ApiKeyId = g.Key,
                                           Key = g.Select(x => x.Key).FirstOrDefault(x => x != null),
                                           UsageCount = g.Sum(x => x.UsageCount),
                                           LastUsed = g.Max(x => x.LastUsed),
                                           Pattern = g.Select(x => x.Pattern).FirstOrDefault(),
                                           Status = g.Select(x => x.Status).FirstOrDefault(),
                                           Type = g.Select(x => x.Type).FirstOrDefault()
                                           };
4

1 に答える 1

2

インデックス作成エラーは、空のコレクションをsequence contains no matching elements呼び出した結果であるため、を使用する必要があります。また、mapおよびreduce宣言で独自のクラスを参照すると、RavenDBはインデックス作成時にこれらの型を解決できないため、エラーが発生します。FirstFirstOrDefault

于 2012-09-20T16:26:39.310 に答える