如何解决方法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 => true))(M)
替换condition(M)
部分,但即使这样也无济于事。
有什么建议吗?
谢谢。
【问题讨论】:
什么是Items
?
@Llama 这是一个IMongoCollection<M>
- 类似于集合的界面。现在我很确定这只是Find
内部的问题需要关注...
M
是一种类型吗?还是在定义此方法的类中定义的类型变量?还是别的什么?
什么是Predicate<M>
?那么这与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以上是关于如何解决方法c#中的谓词错误的主要内容,如果未能解决你的问题,请参考以下文章