【问题标题】:Operator '??' cannot be applied to operands of type IQueryContainer and lambda expression操作员 '??'不能应用于 IQueryContainer 类型的操作数和 lambda 表达式
【发布时间】:2015-06-15 04:34:35
【问题描述】:

我正在尝试创建一种方法来处理某个查询。我按照 Nest repository(第 60 行)上发布的示例进行操作,但编译器仍然无法识别 MatchAll,如果我尝试构建解决方案,则显示的错误是:

运算符'??'不能应用于 IQueryContainer 类型的操作数和 lambda 表达式

这是我目前的方法:

public void ProcessQuery(IQueryContainer query = null)
{

   var searchResult = this._client.Search<T>(
                s => s
                    .Index(MyIndex)
                    .AllTypes()
                    .From(0)
                    .Take(10)
                    .Query(query ?? (q => q.MatchAll())) // Not valid
                    .SearchType(SearchType.Scan)
                    .Scroll("2m")
                );
}

【问题讨论】:

  • 对于使用操作数 ??,您需要的是查询类型和 (q => q.MatchAll()) 应该相同,因为您提供的是替换IQueryContainer 作为 Lambda,可以填写 Action 或类似的委托,这就是它失败的原因。匹配他们的类型,这样才能成功

标签: c# elasticsearch nest


【解决方案1】:

lambda 表达式的类型可以转换为Expression 或某些委托类型,但很可能不会转换为IQueryContainer。 Lambda 表达式本身没有类型,并且需要特定的上下文来进行自动转换,您可以给出例如通过使用适当的委托类型构造函数。但再说一遍:我不相信?? 一侧的接口和另一侧的 lambda 表达式有任何意义。

【讨论】:

    【解决方案2】:

    感谢@Mrinal Kamboj 的评论和@Wormbo 的回答,我找到了自己的答案:
    我将参数类型更改为QueryContainer,如果参数为空,则会创建一个新的QueryMatchAll 查询,这对我有用:

    public void ProcessQuery(QueryContainer query = null)
    {
    
       var searchResult = this._client.Search<T>(
                    s => s
                        .Index(MyIndex)
                        .AllTypes()
                        .From(0)
                        .Take(10)
                        .Query(query ?? new MatchAllQuery()) // Now works
                        .SearchType(SearchType.Scan)
                        .Scroll("2m")
                    );
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-09
      • 2015-12-11
      • 2013-11-06
      • 2016-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多