Мне нужно внедрить команду SQL МЕЖДУ в Entity Framework Core 2.2.4 по соображениям производительности (не спрашивайте почему, это другая история). Я использовал подход, чтобы заменить сервисы ICompositeMethodCallTranslator и IQuerySqlGeneratorFactory собственными обработчиками для внедрения перевода BETWEEN, как здесь: https://github.com/elepner/ef-experiments
Я застрял при переводе MethodCallExpression в правильное выражение SQL. Код ниже выдает BETWEEN([table].[column], @__fromValue_0, @__toValue_1)
, но мне нужно [table].[column] BETWEEN @__fromValue_0 AND @__toValue_1
.
public class BetweenTranslator : IMethodCallTranslator
{
private static readonly MethodInfo _methodInfo = typeof(EFCoreExtensions).GetRuntimeMethod(nameof(EFCoreExtensions.Between), new[] { typeof(double?), typeof(double), typeof(double) });
public Expression Translate(MethodCallExpression methodCallExpression)
{
if (methodCallExpression.Method != _methodInfo) return null;
var toValueExpression = methodCallExpression.Arguments[2];
var fromValueExpression = methodCallExpression.Arguments[1];
var objectExpression = (ColumnExpression)methodCallExpression.Arguments[0];
// Syntax: {objectExpression} BETWEEN {fromValueExpression} AND {toValueExpression}
var sqlExpression = new SqlFunctionExpression("BETWEEN", typeof(bool), new[] { objectExpression, fromValueExpression, toValueExpression });
return sqlExpression;
}
}
Как создать правильное выражение МЕЖДУ из выражения MethodCallExc?