如何解决方法c#中的谓词错误

Posted

技术标签:

【中文标题】如何解决方法c#中的谓词错误【英文标题】:How to solve predicate error in a method c# 【发布时间】:2021-12-26 08:11:48 【问题描述】:

我在 C# 中的通用抽象类中有一个方法,但似乎一旦我运行应用程序:

System.ArgumentException: Unsupported filter: Invoke(value(...), document).

以及产生错误的代码:

public I Get<I>(string id, IBsonSerializer<I> serializer = null, Predicate<M> condition) where I : IModelBase =>
            Items.Find(M => M.Id == id && condition(M)).As(serializer).FirstOrDefault();

现在问题在于 Find 调用,因此您可以忽略其他代码。

我发现我可以用(condition ?? (ignore =&gt; true))(M) 替换condition(M) 部分,但即使这样也无济于事。

有什么建议吗?

谢谢。

【问题讨论】:

什么是Items @Llama 这是一个IMongoCollection&lt;M&gt; - 类似于集合的界面。现在我很确定这只是Find 内部的问题需要关注... M 是一种类型吗?还是在定义此方法的类中定义的类型变量?还是别的什么? 什么是Predicate&lt;M&gt;?那么这与mongo有关吗?您的问题缺少很多上下文,因此很难回答。 【参考方案1】:

https://github.com/mongodb/mongo-csharp-driver/blob/93614cccfa52d34a5807477df614aee6a2beb0a6/src/MongoDB.Driver/Linq/Linq2Implementation/Translators/PredicateTranslator.cs#L73-L147

在这段代码 sn-p 中,我们可以看到 PredicateTranslator 没有处理具有“Invoke”节点类型的表达式。 可以尝试让条件不再是表达式的一部分,例如先计算 lambda 之外的条件值。

【讨论】:

谢谢,但我决定再扩展一些方法...... public I Get(string id, IBsonSerializer serializer = null, Predicate condition) where I : IModelBase var b= condition(M); Items.Find(M => M.Id == id && b).As(serializer).FirstOrDefault();

以上是关于如何解决方法c#中的谓词错误的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 C# 中的简单变量问题?

Vue---vue-cli 中的proxyTable解决开发环境中的跨域问题

c#Ajax 的错误,应该如何解决?

如何解决此 C# 代码中的 CORS 错误?

如何使用有限谓词递归确定序言中的商?

c# 解决读取Excel混合文本类型,数据读取失败的解决方法