FreeSql icon indicating copy to clipboard operation
FreeSql copied to clipboard

新增SqlServer下对`string.Compare`和`string.CompareTo`方法的转译支持

Open LeaFrock opened this issue 5 months ago • 0 comments

以下2种方式:

var sql1 = freeSql.Select<UserInfo>()
    .Where(a => a.Name.CompareTo("LeaFrock") > 0)
    .ToSql();

var sql2 = freeSql.Select<UserInfo>()
    .Where(a => string.Compare(a.Name, "LeaFrock") > 0)
    .ToSql();

将被转译为:

SELECT a.[Id], a.[Name]
FROM [UserInfo] a
WHERE ((case when a.[Name] = N'LeaFrock' then 0 when a.[Name] > N'LeaFrock' then 1 else -1 end) > 0)

疑问:

目前转译表达式树的方式是自上而下单向的,似乎没办法结合表达式的父结点信息,来对整体生成的SQL做一些深度优化。比如使用string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc)解析string.Compare(a.Name, "LeaFrock")时,无法充分利用上层的BinaryExpression(xxx > 0)的常量信息来简化SQL。在EF Core中则有类似的优化方式

LeaFrock avatar Aug 04 '25 05:08 LeaFrock