4 changed files with 364 additions and 0 deletions
@ -0,0 +1,68 @@ |
|||
using Elastic.Clients.Elasticsearch.QueryDsl; |
|||
using System; |
|||
using System.Linq.Expressions; |
|||
|
|||
namespace LINGYUN.Abp.Elasticsearch; |
|||
|
|||
public partial class ExpressionQueryTranslator |
|||
{ |
|||
/// <summary>
|
|||
/// 尝试翻译包含方法调用的比较表达式
|
|||
/// </summary>
|
|||
private Query? TryTranslateMethodComparison(BinaryExpression node, string? prefix, IndexMappingInfo? mappingInfo) |
|||
{ |
|||
// 处理 (field.Method(value) == 0) 或 (field.Method(value) >= 0) 这类表达式
|
|||
if (node.Left is MethodCallExpression leftMethodCall) |
|||
{ |
|||
return TranslateMethodComparison(leftMethodCall, node.Right, node.NodeType, prefix, mappingInfo); |
|||
} |
|||
|
|||
// 处理 (0 == field.Method(value)) 或 (0 <= field.Method(value)) 这类表达式
|
|||
if (node.Right is MethodCallExpression rightMethodCall) |
|||
{ |
|||
// 反转比较操作符
|
|||
var reversedNodeType = ReverseComparisonOperator(node.NodeType); |
|||
return TranslateMethodComparison(rightMethodCall, node.Left, reversedNodeType, prefix, mappingInfo); |
|||
} |
|||
|
|||
return null; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 翻译方法调用比较
|
|||
/// </summary>
|
|||
private Query? TranslateMethodComparison( |
|||
MethodCallExpression methodCall, |
|||
Expression constantExpression, |
|||
ExpressionType comparisonType, |
|||
string? prefix, |
|||
IndexMappingInfo? mappingInfo) |
|||
{ |
|||
// 限定string方法调用
|
|||
if (methodCall.Method.DeclaringType != typeof(string)) |
|||
{ |
|||
return methodCall.Method.Name switch |
|||
{ |
|||
nameof(string.CompareTo) => TranslateStringCompareToComparison(methodCall, constantExpression, comparisonType, prefix, mappingInfo), |
|||
nameof(string.IndexOf) => TranslateStringIndexOfComparison(methodCall, constantExpression, comparisonType, prefix, mappingInfo), |
|||
_ => null, |
|||
}; |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
/// <summary>
|
|||
/// 反转比较操作符
|
|||
/// </summary>
|
|||
private ExpressionType ReverseComparisonOperator(ExpressionType nodeType) |
|||
{ |
|||
return nodeType switch |
|||
{ |
|||
ExpressionType.GreaterThan => ExpressionType.LessThan, |
|||
ExpressionType.GreaterThanOrEqual => ExpressionType.LessThanOrEqual, |
|||
ExpressionType.LessThan => ExpressionType.GreaterThan, |
|||
ExpressionType.LessThanOrEqual => ExpressionType.GreaterThanOrEqual, |
|||
_ => nodeType |
|||
}; |
|||
} |
|||
} |
|||
Loading…
Reference in new issue