我正在尝试遵循索引教程"示例II"来自的DocumenQuery https://ravendb.net/docs/article-page/3.5/csharp/indexes/map-indexes
并获得以下InvalidOperationException:
"查询结果类型为'资源'但是你希望得到类型'结果'的结果。如果要返回投影,则应在调用.ToList()之前使用.ProjectFromIndexFieldsInto()(对于Query)或.SelectFields()(对于DocumentQuery)。"
我的设置与文档有所不同。
我有一个像这样的索引设置:
public class ResourceIndex : AbstractIndexCreationTask<Raven.Resource>
{
public class Result
{
public string[] Query { get; set; }
}
public ResourceIndex()
{
Map = resources => from resource in resources
select new
{
Query = new[]
{
resource.ID.ToString(),
}
};
Index("Query", FieldIndexing.Analyzed);
}
}
...
并像这样查询:
public IEnumerable<Raven.Resource> QueryAssets(string searchTerm)
{
using (IDocumentSession session = dataStore.OpenSession())
{
var resources = session
.Advanced
.DocumentQuery<ResourceIndex.Result, ResourceIndex>()
.Search(x => x.Query, searchTerm).OfType<Raven.Resource>().ToList();
return resources;
}
}
我的设置中缺少什么,以及如何使用DocumentQuery和.Search组合索引的文档?
答案 0 :(得分:1)
您只需在Search
.SelectField<Raven.Resource>()
之后添加,它就会像建议的异常一样工作。您的查询应该看起来像这样
var resources = session
.Advanced
.DocumentQuery<ResourceIndex.Result, ResourceIndex>()
.Search(x => x.Query, searchTerm).SelectFields<Raven.Resource>().ToList();
您现在没有遗漏文档中的任何内容,只需删除OfType()
并仅使用SelectFields
对于查询OfType
的工作方式与SelectFields
的工作方式相同,因此如果您使用此查询,您的查询应如下所示:
session.Query<ResourceIndex.Result, ResourceIndex>()
.Search(x => x.Query, "2").OfType<Resource>().ToList();
答案 1 :(得分:0)
这对聚会来说可能有点晚了,但是我认为出错的原因是:
您已声明:
public class ResourceIndex : AbstractIndexCreationTask<Raven.Resource>
这说:基于文档Raven.Resource
创建一个索引,它将最终返回Raven.Resource
类型的结果。
然后在您的代码中,要使用此索引,您已经说过:
.DocumentQuery<ResourceIndex.Result, ResourceIndex>()
这说:查询索引ResourceIndex
,我希望返回ResourceIndex.Result
文档。
但是...这是错误的。然后索引包含Raven.Resource
个文档,而不是ResourceIndex.Result
个文档。