【问题标题】:How to define TermsQuery for searching list of integer?如何定义术语查询以搜索整数列表?
【发布时间】:2021-02-21 04:17:58
【问题描述】:

使用对象初始化器语法,在定义条款的行上,我收到一个错误:无法将源类型 'System.Collections.Generic.List' 转换为目标类型 'System.Collections.Generic.IEnumerable '

var query = new TermsQuery
{
 Field = new Field("seq"),
 Terms = new List<int> {1 ,2, 3}
};

如果使用流利的 DSL 定义,则此方法有效

var search = new List<int> {1, 2, 3};   

q.Terms(c => c
    .Field(p => p.seq)
    .Terms(search)
)

我在对象初始值设定项语法上做错了什么?提前感谢您的帮助。

【问题讨论】:

  • Terms = new List&lt;object&gt; {1 ,2, 3}
  • 尽管@mjwills 解决了错误,但我会检查为什么Terms 期望object 的可枚举而不是int。它们之间的转换称为装箱和拆箱,在性能方面可能非常昂贵。
  • The conversion between them called boxing and unboxing and may be very costly in terms of performance. 对于三个值,性能成本将是微乎其微的。

标签: c# elasticsearch nest


【解决方案1】:

我可以将第一种情况的失败归因于C# 的基本点。 int 是一种值类型,尝试将 List&lt;int&gt; 分配给 IEnumerable&lt;object&gt; 失败,因为值类型不支持泛型变化。如果您将 List&lt;string&gt; 分配给 IEnumerable&lt;object&gt; 引用类型,同样的事情也可以正常工作。查看 Jon Skeet 的this 回答,了解更多信息。此外,您可以从MSDN 中查找更多关于泛型中的协变和逆变的信息。实现此功能的一种方法是对您的 List&lt;int&gt; 类型变量执行显式转换。

此外,对于流畅的 DSL 方法,Terms 方法可能存在两种重载。

TermsQueryDescriptor<T> Terms<TValue>(IEnumerable<TValue> terms)

TermsQueryDescriptor<T> Terms<TValue>(params TValue[] terms)

如果您查看here 中这些方法的实现,您会看到传入的类型T 是推断出来的,并且所需的转换是在内部完成的。这就是为什么在流畅的 DSL 方法中不会遇到这个问题的原因。

【讨论】:

  • Sai,感谢您对问题的解释。我已经将整数列表转换为字符串列表,它似乎工作得很好。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2019-08-03
  • 2012-09-09
  • 2021-07-25
  • 1970-01-01
  • 2014-01-17
  • 2014-06-02
  • 1970-01-01
  • 2016-04-16
相关资源
最近更新 更多