MongoDB C#相等覆盖isn';我没有捡起来

MongoDB C#相等覆盖isn';我没有捡起来,c#,mongodb,linq,operator-overloading,equality,C#,Mongodb,Linq,Operator Overloading,Equality,我有以下代码块: public bool Equals(TranslatedTextReference other) { if (other is null) return false; return Translations.Equals(other.Translations); } public bool Equals(string other) { foreach(KeyValuePair<st

我有以下代码块:

    public bool Equals(TranslatedTextReference other)
    {
        if (other is null) return false;
        return Translations.Equals(other.Translations);
    }

    public bool Equals(string other)
    {
        foreach(KeyValuePair<string, string> pair in Translations)
        {
            if (other.Equals(pair.Value, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }

    public static bool operator ==(TranslatedTextReference left, TranslatedTextReference right) => left.Equals(right);
    public static bool operator !=(TranslatedTextReference left, TranslatedTextReference right) => left.Equals(right);

    public static bool operator ==(TranslatedTextReference left, string right) => left.Equals(right);
    public static bool operator !=(TranslatedTextReference left, string right) => !left.Equals(right);
public bool Equals(translatedExterReference其他)
{
如果(其他为空)返回false;
返回Translations.Equals(其他.Translations);
}
公共布尔等于(字符串其他)
{
foreach(翻译中的KeyValuePair对)
{
if(其他.Equals(pair.Value、StringComparison.InvariantCultureInogoreCase))
返回true;
}
返回false;
}
公共静态布尔运算符==(translatedExtreference左,translatedExtreference右)=>left.Equals(右);
公共静态布尔运算符=(translatedExtreference左,translatedExtreference右)=>left.Equals(右);
公共静态布尔运算符==(translatedExtrareference左,字符串右)=>left.Equals(右);
公共静态布尔运算符=(translatedExtrareference左,string右)=>!左。等于(右);
它重写名为translatedExtreference的自定义类中的Equalas和==行为。 及

database.GetCollection(“元素”).AsQueryable()
.FirstOrDefault(元素=>element.TranslatedElementName==name);
理论上,它应该查询Mongo并使用重写的==运算符。 实际上,这是行不通的,因为(我假设)重写的操作符实际上没有被调用,因为LINQ查询是作为MongoDB查询直接在MongoDB服务器上执行的。事实上,另一段使用默认相等运算符的代码工作得非常好

database.GetCollection<Element>("elements").AsQueryable()
            .FirstOrDefault(element => element.AtomicNumber == atomicNumber);
database.GetCollection(“元素”).AsQueryable()
.FirstOrDefault(element=>element.AtomicNumber==AtomicNumber);
原子数是一个整数

有没有办法让MongoDB使用我的自定义操作符


此外,我知道我可以只使用默认运算符并用它们构建相同的查询,但我必须在LINQ查询中使用==或.Equals()。

无法实现这种行为,因为驱动程序只“知道”某些类型的方法,并且能够将它们转换为MongoDB查询

想象一下,您在自定义的
Equals
实现中编写了各种时髦的代码(比如调用Web服务或记录一些东西或其他)。驱动程序将如何将其转换为MongoDB查询

查看驱动程序代码时,您会发现转换逻辑仅基于表达式树中作为谓词传递的相应方法的名称:

private FilterDefinition<BsonDocument> TranslateMethodCall(MethodCallExpression methodCallExpression)
{
    switch (methodCallExpression.Method.Name)
    {
        case "Contains": return TranslateContains(methodCallExpression);
        case "ContainsKey": return TranslateContainsKey(methodCallExpression);
        case "EndsWith": return TranslateStringQuery(methodCallExpression);
        case "Equals": return TranslateEquals(methodCallExpression);
        case "HasFlag": return TranslateHasFlag(methodCallExpression);
        case "In": return TranslateIn(methodCallExpression);
        case "IsMatch": return TranslateIsMatch(methodCallExpression);
        case "IsNullOrEmpty": return TranslateIsNullOrEmpty(methodCallExpression);
        case "StartsWith": return TranslateStringQuery(methodCallExpression);
    }

    return null;
}
专用筛选器定义TranslateMethodCall(MethodCallExpression MethodCallExpression)
{
开关(methodCallExpression.Method.Name)
{
case“Contains”:返回TranslateContains(methodCallExpression);
案例“ContainsKey”:返回TranslateContainsKey(methodCallExpression);
案例“EndsWith”:返回TranslateStringQuery(methodCallExpression);
大小写“等于”:返回TranslateEquals(methodCallExpression);
案例“HasFlag”:返回TranslateHasFlag(methodCallExpression);
case“In”:返回TranslateIn(methodCallExpression);
案例“IsMatch”:返回TranslateIsMatch(methodCallExpression);
案例“IsNullOrEmpty”:返回TranslateIsNullOrEmpty(methodCallExpression);
案例“StartsWith”:返回TranslateStringQuery(methodCallExpression);
}
返回null;
}

无法实现这种行为,因为驱动程序只“知道”某些类型的方法,并且能够将它们转换为MongoDB查询

想象一下,您在自定义的
Equals
实现中编写了各种时髦的代码(比如调用Web服务或记录一些东西或其他)。驱动程序将如何将其转换为MongoDB查询

查看驱动程序代码时,您会发现转换逻辑仅基于表达式树中作为谓词传递的相应方法的名称:

private FilterDefinition<BsonDocument> TranslateMethodCall(MethodCallExpression methodCallExpression)
{
    switch (methodCallExpression.Method.Name)
    {
        case "Contains": return TranslateContains(methodCallExpression);
        case "ContainsKey": return TranslateContainsKey(methodCallExpression);
        case "EndsWith": return TranslateStringQuery(methodCallExpression);
        case "Equals": return TranslateEquals(methodCallExpression);
        case "HasFlag": return TranslateHasFlag(methodCallExpression);
        case "In": return TranslateIn(methodCallExpression);
        case "IsMatch": return TranslateIsMatch(methodCallExpression);
        case "IsNullOrEmpty": return TranslateIsNullOrEmpty(methodCallExpression);
        case "StartsWith": return TranslateStringQuery(methodCallExpression);
    }

    return null;
}
专用筛选器定义TranslateMethodCall(MethodCallExpression MethodCallExpression)
{
开关(methodCallExpression.Method.Name)
{
case“Contains”:返回TranslateContains(methodCallExpression);
案例“ContainsKey”:返回TranslateContainsKey(methodCallExpression);
案例“EndsWith”:返回TranslateStringQuery(methodCallExpression);
大小写“等于”:返回TranslateEquals(methodCallExpression);
案例“HasFlag”:返回TranslateHasFlag(methodCallExpression);
case“In”:返回TranslateIn(methodCallExpression);
案例“IsMatch”:返回TranslateIsMatch(methodCallExpression);
案例“IsNullOrEmpty”:返回TranslateIsNullOrEmpty(methodCallExpression);
案例“StartsWith”:返回TranslateStringQuery(methodCallExpression);
}
返回null;
}

有没有实现自定义转换逻辑的方法?您可以使用fork驱动程序实现所需的任何行为,但我不推荐使用此选项。或者,您可以(尝试)使用表达式或甚至基于字符串的筛选器编写自定义比较,并在需要时使用它们。谢谢,这有文档记录吗,如果是的话,你能提供一个链接吗?我可能听起来很深奥,但我实际上只是指到处都有文档记录的查询资料的标准方法,例如:这里:另外,如果你只处理非常小的收集,您可以做的一件事就是简单地评估客户端的
Equals
部分,这显然会像您期望的那样工作。有没有实现自定义翻译逻辑的方法?您可以使用fork驱动程序并实现您需要的任何行为,但我不推荐此选项。或者,您可以(尝试)使用表达式或甚至基于字符串的过滤器编写自定义比较,并在需要时使用它们。谢谢,这有文档记录吗?如果有,您可以提供一个链接吗?我可能听起来很深奥,但我真的只是指查询内容的标准方法