RavenDB InvalidOperationException&#34;查询结果类型是&#39; <document>&#39;但是你希望得到&#39; <indexresult>&#39; &#34;

时间:2017-03-31 14:50:16

标签: ravendb

我正在尝试遵循索引教程&#34;示例II&#34;来自的DocumenQuery https://ravendb.net/docs/article-page/3.5/csharp/indexes/map-indexes

并获得以下InvalidOperationException:

&#34;查询结果类型为&#39;资源&#39;但是你希望得到类型&#39;结果&#39;的结果。如果要返回投影,则应在调用.ToList()之前使用.ProjectFromIndexFieldsInto()(对于Query)或.SelectFields()(对于DocumentQuery)。&#34;

我的设置与文档有所不同。

我有一个像这样的索引设置:

    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组合索引的文档?

2 个答案:

答案 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个文档。