Ravendb 尝试查询子对象结果 "cannot index not indexed field"
Ravendb trying to query child object results in "cannot index not indexed field"
我认为 class 会根据索引不言自明:
public class CalendarMatchIndex : AbstractIndexCreationTask<CalendarMatch>
{
public CalendarMatchIndex()
{
Map = matches => from match in matches
select new
{
match.CalendarId,
match.MatchDate,
match.CommunityId,
CategoryId = match.ImportData.CategoryId,
TeamTypeId = match.ImportData.TeamTypeId,
TeamSheetDeadline =match.ImportData.TeamSheetDeadline,
ActivityId =match.ImportData.ActivityId,
};
}
}
}
查询:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);
结果在 'importdata.categoryid not indexed error'。我如何在不使用单独的结果 class 并且必须存储所有字段的情况下查询此字段?
编辑:添加 Json:
{
"CalendarId": "7ui824avw496",
"ImportData": {
"ActivityType": "Tournament",
"ActivityId": "aqhfl52xbff137",
"LinkedMatchId": "bykdzj5j11kagf"
},
"CommunityId": null
}
查看您的索引定义,您将 ImportData.CategoryId
索引为 CategoryId
字段,这意味着您的查询应如下所示:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);
在我的查询中查看 x.ImportData.CategoryId
-> x.CategoryId
更改。
创建一个结果class,其结构对应于索引结果:
public class CalendarMatchResult
{
public string CalendarId { get; set; }
public DateTime? MatchDate { get; set; }
public string CommunityId { get; set; }
public string CategoryId { get; set; }
public string TeamTypeId { get; set; }
public DateTime? TeamSheetDeadline { get; set; }
public string ActivityId { get; set; }
}
然后,你可以这样查询索引:
var query = session.Query<CalendarMatchResult, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);
您不需要存储这些字段,除非您需要直接为索引检索它们。对于过滤,不存储的字段就可以了。
如果你不想在过去(ravendb 2.5)中创建一个结果class,我在地图上使用了这个语法:
Map = matches => from match in matches
select new
{
match.CalendarId,
match.MatchDate,
match.CommunityId,
ImportData_CategoryId = match.ImportData.CategoryId,
ImportData_TeamTypeId = match.ImportData.TeamTypeId,
ImportData_TeamSheetDeadline = match.ImportData.TeamSheetDeadline,
ImportData_ActivityId = match.ImportData.ActivityId,
};
使用这张地图,您的查询应该有效:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);
我认为 class 会根据索引不言自明:
public class CalendarMatchIndex : AbstractIndexCreationTask<CalendarMatch>
{
public CalendarMatchIndex()
{
Map = matches => from match in matches
select new
{
match.CalendarId,
match.MatchDate,
match.CommunityId,
CategoryId = match.ImportData.CategoryId,
TeamTypeId = match.ImportData.TeamTypeId,
TeamSheetDeadline =match.ImportData.TeamSheetDeadline,
ActivityId =match.ImportData.ActivityId,
};
}
}
}
查询:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);
结果在 'importdata.categoryid not indexed error'。我如何在不使用单独的结果 class 并且必须存储所有字段的情况下查询此字段?
编辑:添加 Json:
{
"CalendarId": "7ui824avw496",
"ImportData": {
"ActivityType": "Tournament",
"ActivityId": "aqhfl52xbff137",
"LinkedMatchId": "bykdzj5j11kagf"
},
"CommunityId": null
}
查看您的索引定义,您将 ImportData.CategoryId
索引为 CategoryId
字段,这意味着您的查询应如下所示:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);
在我的查询中查看 x.ImportData.CategoryId
-> x.CategoryId
更改。
创建一个结果class,其结构对应于索引结果:
public class CalendarMatchResult
{
public string CalendarId { get; set; }
public DateTime? MatchDate { get; set; }
public string CommunityId { get; set; }
public string CategoryId { get; set; }
public string TeamTypeId { get; set; }
public DateTime? TeamSheetDeadline { get; set; }
public string ActivityId { get; set; }
}
然后,你可以这样查询索引:
var query = session.Query<CalendarMatchResult, CalendarMatchIndex>()
.Where(x => x.CategoryId == input.CategoryId);
您不需要存储这些字段,除非您需要直接为索引检索它们。对于过滤,不存储的字段就可以了。
如果你不想在过去(ravendb 2.5)中创建一个结果class,我在地图上使用了这个语法:
Map = matches => from match in matches
select new
{
match.CalendarId,
match.MatchDate,
match.CommunityId,
ImportData_CategoryId = match.ImportData.CategoryId,
ImportData_TeamTypeId = match.ImportData.TeamTypeId,
ImportData_TeamSheetDeadline = match.ImportData.TeamSheetDeadline,
ImportData_ActivityId = match.ImportData.ActivityId,
};
使用这张地图,您的查询应该有效:
var query = session.Query<CalendarMatch, CalendarMatchIndex>()
.Where(x => x.ImportData.CategoryId == input.CategoryId);