2012-08-21 3 views
3

어떻게 널 (NULL) 필드 객체를지도해야합니까? nullable 필드를 null이 허용되지 않는 버전으로 바꾸어야하고, 내가 비틀 거리는 단계입니다.RavenDB Map/Reduces에서 Nullable 필드를 처리하는 올바른 방법은 무엇입니까?

Null 허용 속성을 매핑하는 적절한 방법은 무엇입니까?

public class Visit { 
    public string Id { get; set; } 
    public int? MediaSourceId { get; set; } 
} 

public class MapReduceResult 
{ 
    public string VisitId { get; set; } 
    public int MediaSourceId { get; set; } 
    public string Version { get; set; } 
    public int Count { get; set; } 
} 

AddMap<Visit>(
    visits => 
    from visit in visits 
    select new 
     { 
      VisitId = visit.Id, 
      MediaSourceId = 
       (visit.MediaSourceId.HasValue) 
       ? visit.MediaSourceId 
       : UNUSED_MEDIASOURCE_ID, 
      Version = (string) null, 
      Count = 1 
     }); 

이것은 작동하지 않습니다. 사실로; 이 맵은 완전히 무시되고 다른 맵은 정상적으로 작동하며 결국에는 예상대로 줄어 듭니다.

도와 주셔서 감사합니다.

다음은 "<null>을 익명 유형 속성에 할당 할 수 없습니다"라는 오류가 새로 추가 된 테스트 사례입니다. 최소한의 고통으로이 비행을 어떻게해야합니까?

[TestFixture] 
public class MyIndexTest 
{ 
    private IDocumentStore _documentStore; 

    [SetUp] 
    public void SetUp() 
    { 
     _documentStore = new EmbeddableDocumentStore {RunInMemory = true}.Initialize(); 
     _documentStore.DatabaseCommands.DisableAllCaching(); 

     IndexCreation.CreateIndexes(typeof (MyIndex).Assembly, _documentStore); 
    } 

    [TearDown] 
    public void TearDown() 
    { 
     _documentStore.Dispose(); 
    } 

    [Test] 
    public void ShouldWork() 
    { 
     InitData(); 

     IList<MyIndex.MapReduceResult> mapReduceResults = null; 
     using (var session = _documentStore.OpenSession()) 
     { 
      mapReduceResults = 
       session.Query<MyIndex.MapReduceResult>(
        MyIndex.INDEX_NAME) 
        .Customize(x => x.WaitForNonStaleResults()).ToArray(); 
     } 
     Assert.That(mapReduceResults.Count, Is.EqualTo(1)); 
    } 

    private void InitData() 
    { 
     var visitOne = new Visit 
          { 
           Id = "visits/64", 
           MetaData = new MetaData {CreatedDate = new DateTime(1975, 8, 6, 0, 14, 0)}, 
           MediaSourceId = 1, 
          }; 
     var visitPageVersionOne = new VisitPageVersion 
             { 
              Id = "VisitPageVersions/123", 
              MetaData = new MetaData {CreatedDate = new DateTime(1975, 8, 6, 0, 14, 0)}, 
              VisitId = "visits/64", 
              Version = "1" 
             }; 

     using (var session = _documentStore.OpenSession()) 
     { 
      session.Store(visitOne); 
      session.Store(visitPageVersionOne); 
      session.SaveChanges(); 
     } 
    } 

    public class MyIndex : 
     AbstractMultiMapIndexCreationTask 
      <MyIndex.MapReduceResult> 
    { 
     public const string INDEX_NAME = "MyIndex"; 

     public override string IndexName 
     { 
      get { return INDEX_NAME; } 
     } 

     public class MapReduceResult 
     { 
      public string VisitId { get; set; } 
      public int? MediaSourceId { get; set; } 
      public string Version { get; set; } 
      public int Count { get; set; } 
     } 

     public MyIndex() 
     { 
      AddMap<Visit>(
       visits => 
       from visit in visits 
       select new 
          { 
           VisitId = visit.Id, 
           MediaSourceId = (int?) visit.MediaSourceId, 
           Version = (string) null, 
           Count = 1 
          }); 
      AddMap<VisitPageVersion>(
       visitPageVersions => 
       from visitPageVersion in visitPageVersions 
       select new 
          { 
           VisitId = visitPageVersion.VisitId, 
           MediaSourceId = (int?) null, 
           Version = visitPageVersion.Version, 
           Count = 0 
          }); 
      Reduce = 
       results => 
       from result in results 
       group result by result.VisitId 
       into g 
       select 
        new 
         { 
          VisitId = g.Key, 
          MediaSourceId = (int?) g.Select(x => x.MediaSourceId).FirstOrDefault(), 
          Version = g.Select(x => x.Version).FirstOrDefault(), 
          Count = g.Sum(x => x.Count) 
         }; 
     } 
    } 
} 

답변

0

nullables 특수 처리를 제공하기 위해 어떤 조치도 취할 필요가 없습니다. RavenDB가 이미이를 처리 할 것입니다.

+2

빠른 답장을 보내 주셔서 감사합니다. 나는 내 문제를 보여주는 완전한 테스트 케이스를 추가했다. 그것은 "을 할당 할 수 없습니다 ..."를 던지는 것으로 끝납니다. Raving 할 때 이것을 처리하는 기본 방법은 무엇입니까? – Molibar

+0

@Oren, RavenDB는 reduce에서 "NULL 부분"을 어떻게 처리합니까 (예 : Version = g.Select (x => x.Version) .FirstOrDefault()). 또한 First() 만 사용하면 결과가 0이됩니다. FirstOrDefault()를 사용해야했습니다. 내 생각에 이것은 "당신은 nullable 특별 대우를하기 위해 무엇을 할 필요가 없습니다. RavenDB는 이미 그것을 처리 할 것입니다"라고 말한 것입니다. 어떻게 완료되었는지 이해하고 싶습니다. – Jeff

관련 문제