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)
};
}
}
}
빠른 답장을 보내 주셔서 감사합니다. 나는 내 문제를 보여주는 완전한 테스트 케이스를 추가했다. 그것은 "을 할당 할 수 없습니다 ..."를 던지는 것으로 끝납니다. Raving 할 때 이것을 처리하는 기본 방법은 무엇입니까? –
Molibar
@Oren, RavenDB는 reduce에서 "NULL 부분"을 어떻게 처리합니까 (예 : Version = g.Select (x => x.Version) .FirstOrDefault()). 또한 First() 만 사용하면 결과가 0이됩니다. FirstOrDefault()를 사용해야했습니다. 내 생각에 이것은 "당신은 nullable 특별 대우를하기 위해 무엇을 할 필요가 없습니다. RavenDB는 이미 그것을 처리 할 것입니다"라고 말한 것입니다. 어떻게 완료되었는지 이해하고 싶습니다. – Jeff