2017-03-31 8 views
0

我试图按照索引教程“例II”的DocumenQuery从 https://ravendb.net/docs/article-page/3.5/csharp/indexes/map-indexesRavenDB InvalidOperationException异常“的查询结果类型是‘<Document>’,但你有望获得类型‘<IndexResult>’的结果”

并获得InvalidOperationException:

“查询结果类型是'资源',但您期望得到'Result'类型的结果。如果要返回投影,则应该使用.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; 
     } 
    } 

我失去了什么在我的设置VS有关如何结合使用索引的文档带有DocumentQuery和.Search?

回答

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();