为SearchRequest添加Source Filter时遇Fields非泛型类型错误求助
解决NEST中Source Filter的"非泛型类型‘Fields’不能与类型实参一起使用"错误
这个报错我之前也碰到过,本质是新版本的NEST(Elasticsearch .NET客户端)对字段指定的API做了调整,旧的泛型Fields<T>写法已经不再适用了。咱们来一步步解决:
方法一:使用强类型的Infer.Field(推荐)
这是新版本NEST官方推荐的强类型写法,既能保证编译时检查字段正确性,又适配新API:
var request = new SearchRequest<ElasticSearchJsonObject.Rootobject>(Nest.Indices.Index("myindex"), Types.All) { From = 0, Size = 10, Query = query, Source = new SourceFilter { Includes = "*", Excludes = new[] { Infer.Field<ElasticSearchJsonObject.Rootobject>(p => p.footer) } } };
方法二:直接用字符串指定字段(简洁但无编译检查)
如果不需要强类型的约束,也可以直接写字段的字符串名称:
var request = new SearchRequest<ElasticSearchJsonObject.Rootobject>(Nest.Indices.Index("myindex"), Types.All) { From = 0, Size = 10, Query = query, Source = new SourceFilter { Includes = "*", Excludes = new[] { "footer" } } };
注意:这种写法要确保字符串和Elasticsearch中的字段名完全一致,实体类字段改名后这里不会自动同步,需要手动维护。
方法三:使用Fields.Of<T>(部分版本适用)
如果你的NEST版本支持,也可以用Fields静态类的Of方法来实现强类型字段指定:
var request = new SearchRequest<ElasticSearchJsonObject.Rootobject>(Nest.Indices.Index("myindex"), Types.All) { From = 0, Size = 10, Query = query, Source = new SourceFilter { Includes = "*", Excludes = Fields.Of<ElasticSearchJsonObject.Rootobject>(p => p.footer) } };
补充说明
这个API变化主要出现在NEST 7.x及以后的版本,旧版本的泛型Fields<T>构造方式被移除,换成了更清晰的字段推断API。如果你还在使用6.x及更早的版本,那可能是命名空间引用冲突,确保只引用了Nest命名空间,没有和其他类库的同名Fields类型混淆。
内容的提问来源于stack exchange,提问作者abdul qayyum
相关产品推荐
相关产品推荐

