2012-01-27 2 views
0

Я хочу создать индекс для запроса, я хочу вернуть в свой список список аудио элементов вместе со статистикой для этих элементов, которые являются TotalDownloads & TotalPlays.MultiMap/Reduce - Counts = 0?

Вот мои соответствующие документы:

Audio 
- Id 
- ArtistName 
- Name 

AudioCounter 
- AudioId 
- Type 
- DateTime 

Вот мой текущий индекс:

public class AudioWithCounters : AbstractMultiMapIndexCreationTask<AudioWithCounters.AudioViewModel> 
{ 
    public class AudioViewModel 
    { 
     public string Id { get; set; } 
     public string ArtistName { get; set; } 
     public string Name { get; set; } 
     public int TotalDownloads { get; set; } 
     public int TotalPlays { get; set; } 
    } 

    public AudioWithCounters() 
    { 
     AddMap<Audio>(audios => from audio in audios 
           select new 
           { 
            Id = audio.Id, 
            ArtistName = audio.ArtistName, 
            Name = audio.Name, 
            TotalDownloads = 0, 
            TotalPlays = 0 
           }); 

     AddMap<AudioCounter>(counters => from counter in counters 
             where counter.Type == Core.Enums.Audio.AudioCounterType.Download 
           select new 
           { 
            Id = counter.AudioId, 
            ArtistName = (string)null, 
            Name = (string)null, 
            TotalDownloads = 1, 
            TotalPlays = 0 
           }); 

     AddMap<AudioCounter>(counters => from counter in counters 
             where counter.Type == Core.Enums.Audio.AudioCounterType.Download 
             select new 
             { 
              Id = counter.AudioId, 
              ArtistName = (string)null, 
              Name = (string)null, 
              TotalDownloads = 0, 
              TotalPlays = 1 
             }); 

     Reduce = results => from result in results 
          group result by result.Id 
           into g 
           select new 
           { 
            Id = g.Key, 
            ArtistName = g.Select(x => x.ArtistName).Where(x => x != null).First(), 
            Name = g.Select(x => x.Name).Where(x => x != null).First(), 
            TotalDownloads = g.Sum(x => x.TotalDownloads), 
            TotalPlays = g.Sum(x => x.TotalPlays) 
           }; 
    } 
} 

Однако мой TotalDownloads & TotalPlays всегда 0, хотя там должны быть данные там. Что я делаю не так?

ответ

2

В функции уменьшения, замените .First() на .FirstOrDefault(), затем он работает.

Кроме того, во второй функции карты есть опечатка, потому что вы фильтруете один и тот же AudioCounterType.Download.

+0

Спасибо, не могу поверить, что это было такое простое решение. Вытягивал мои волосы часами с этим! –