3

null 許容フィールドを持つオブジェクトをマップするにはどうすればよいですか? null 許容フィールドを null 非許容バージョンに変換する必要があると思いますが、そのステップに出くわしました。

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)
                        };
        }
    }
}
4

1 に答える 1

0

nullables を特別に扱うために何もする必要はありません。RavenDB はすでにそれを処理します。

于 2012-08-22T07:18:39.243 に答える