gpt4 book ai didi

map - 在 RavenDB Map/Reduces 中处理可为空字段的正确方法?

转载 作者:行者123 更新时间:2023-11-30 23:56:57 27 4
gpt4 key购买 nike

我应该如何映射具有可为空字段的对象?我想我必须将可为 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
});

这行不通!实际上;此 Map 被完全忽略,而其他 Map 工作正常,并且最终按预期减少。

谢谢你帮助我!

下面是一个新添加的测试用例,它因“无法将 分配给匿名类型属性”而失败。我应该如何以最少的痛苦飞行?

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

最佳答案

您无需执行任何操作即可为可空值提供特殊待遇。RavenDB 已经可以解决这个问题。

关于map - 在 RavenDB Map/Reduces 中处理可为空字段的正确方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12061274/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com