我正在尝试按照索引教程"示例 II"获取来自 DocumenQueryhttps://ravendb.net/docs/article-page/3.5/csharp/indexes/map-indexes
并得到以下无效操作异常:
"查询结果类型为'资源',但您希望获得'结果'类型的结果。如果要返回投影,则应使用 。ProjectFromIndexFieldsInto(( (for Query( 或 .SelectFields(( (用于 DocumentQuery( 在调用 之前。ToList((.">
我的设置与文档有何不同,我失败了。
我有一个这样的索引设置:
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
.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();
这对派对来说可能有点晚了,但我认为错误的原因是这样的:
您已声明:
public class ResourceIndex : AbstractIndexCreationTask<Raven.Resource>
这说:根据文档Raven.Resource
创建一个索引,它最终将返回 Raven.Resource
类型的结果。
然后在你的代码中,为了使用这个索引,你已经说:
.DocumentQuery<ResourceIndex.Result, ResourceIndex>()
这说:查询索引ResourceIndex
,我希望返回ResourceIndex.Result
文档。
但。。。这是错误的。然后索引包含Raven.Resource
文档,而不是ResourceIndex.Result
文档。