RavenDB InvalidOperationException "The query results type is '<Document>' but you expected t



我正在尝试按照索引教程"示例 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文档。

最新更新