From c83baec65ebb788e9be4868f664f3cb11f53433b Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 24 Mar 2023 12:44:54 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E6=A0=91=E8=A7=A3=E6=9E=90=20string.Concat=20?= =?UTF-8?q?=E5=A4=9A=E4=BA=8E3=E4=B8=AA=E6=97=B6=E7=9A=84=20bug=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 17 + FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 418 +++++++++++++++ .../Curd/SqlServerSelectWithTempQueryTest.cs | 478 ++++++++++++++++++ .../ClickHouseExpression.cs | 2 + .../CustomExpression.cs | 5 +- .../MySql/CustomMySqlExpression.cs | 2 + .../Oracle/CustomOracleExpression.cs | 2 + .../PostgreSQL/CustomPostgreSQLExpression.cs | 2 + .../SqlServer/CustomSqlServerExpression.cs | 2 + .../DamengExpression.cs | 2 + .../FirebirdExpression.cs | 2 + .../FreeSql.Provider.GBase/GBaseExpression.cs | 2 + .../KingbaseESExpression.cs | 2 + .../MsAccessExpression.cs | 2 + .../FreeSql.Provider.MySql/MySqlExpression.cs | 2 + .../Dameng/OdbcDamengExpression.cs | 2 + .../Default/OdbcExpression.cs | 5 +- .../KingbaseES/OdbcKingbaseESExpression.cs | 2 + .../MySql/OdbcMySqlExpression.cs | 2 + .../Oracle/OdbcOracleExpression.cs | 2 + .../PostgreSQL/OdbcPostgreSQLExpression.cs | 2 + .../SqlServer/OdbcSqlServerExpression.cs | 2 + .../OracleExpression.cs | 2 + .../PostgreSQLExpression.cs | 2 + .../QuestDbExpression.cs | 2 + .../ShenTongExpression.cs | 2 + .../SqlServerExpression.cs | 2 + .../SqliteExpression.cs | 2 + 28 files changed, 967 insertions(+), 2 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 69d18b0a..a033adbb 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -578,6 +578,23 @@ namespace base_entity BaseEntity.Initialization(fsql, () => _asyncUow.Value); #endregion + var sql1c2 = fsql.Select() + .GroupBy(a => new { a.Nickname, a.Avatar }) + .WithTempQuery(b => new + { + sum = b.Sum(b.Value.Sort), + b.Key.Nickname, + b.Key.Avatar, + }) + .OrderByDescending(arg => arg.sum) + .ToSql(arg => new + { + str1 = string.Concat(arg.Nickname, '-', arg.Avatar, '-'), + str2 = string.Concat(arg.Nickname, '-', arg.Avatar) + }); //报错 多括号 + //.ToOne(arg => string.Concat(arg.Nickname, '-', arg.Avatar)); //正常 + Console.WriteLine(sql1c2); + var xp = new Xpb() { Id = "L23035555", diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 06e3330c..23fd15f0 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -575,6 +575,424 @@ + + + 测试任务编号,系统自动生成 + + + + + 送样日期 + + + + + 接收人 + + + + + 创建人 + + + + + 提交人 + + + + + 提交日期 + + + + + 接收人姓名 + + + + + 送样人员 + + + + + 送样人员姓名 + + + + + 接收日期 + + + + + 测试方式(取字典) + + + + + 实验方法ID字符串,以分号间隔 + + + + + 项目编号(原为ProjectID) + + + + + 任务状态 + + + + + 接收状态 + + + + + 拒收理由 + + + + + 分配关联送样Id + + + + + 分配子任务数量 + + + + + 样品编号(目前本身有的) + + + + + 样品编号(已经被分配出去的) + + + + + 项目编号 + + + + + 项目名称 + + + + + 版本号 + + + + + 创建者ID + + + + + 创建人姓名 + + + + + 创建时间 + + + + + ip地址 + + + + + 修改人id + + + + + 修改人姓名 + + + + + 修改人ip + + + + + 修改时间 + + + + + 审批状态,由审批模块返回 + + + + + 信息状态 + + + + + 备注 + + + + + 组织编码 + + + + + 测试任务表 + 主表 + + + + + 测试任务编号,系统自动生成 + + + + + 送样日期 + + + + + 接收人 + + + + + 接收人姓名 + + + + + 送样人员 + + + + + 送样人员姓名 + + + + + 接收日期 + + + + + 测试方式(取字典) + + + + + 项目编号 + + + + + 接收状态 + + + + + 拒收理由 + + + + + 分配关联送样ID + + + + + 分配子任务数量 + + + + + 自定义表单内容 + + + + + 送样样品中间表 + + + + + 样品编号 + + + + + 送样ID + + + + + 送样量 + + + + + 测试任务送样方法表 + + + + + 数据主键 + + + + + 测试任务ID + + + + + 实验方法ID + + + + + 项目信息 + + + + + + 项目编号 + + + + + 项目名称 + + + + + 所属部门 + + + + + 说明 + + + + + 计划开始时间 + + + + + 计划结束时间 + + + + + 实际开始时间 + + + + + 实际结束时间 + + + + + 是否是PM同步过来的 + + + + + PM同步的项目主键信息 + + + + + 是否禁用 1是 0 否 + + + + + 部门Id + + + + + 生物模块信息表 + 主表 + + + + + 生物编号,系统自动生成 + + + + + 项目编号 + + + + + 样品编号 + + + + + 测试方法Id + + + + + 实验日期 + + + + + 送样日期 + + + + + 测试任务ID + + + + + 测试任务编号 + + + + + 记录编号 + + + + + 自定义表单数据 + + + + + 测试类型 + + 表中带点 diff --git a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs index 06327185..0da2b923 100644 --- a/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/SqlServer/Curd/SqlServerSelectWithTempQueryTest.cs @@ -9,6 +9,484 @@ namespace FreeSql.Tests.SqlServer { public class SqlServerSelectWithTempQueryTest { + [Fact] + public void Issues1467() + { + var fsql = g.mysql; + //测试任务信息子查询 + var deliverInfoQuery = fsql.Select() + .LeftJoin(x => x.t1.Id == x.t2.RefId) + .LeftJoin(x => x.t3.DeliverId == x.t1.Id) + .LeftJoin(x => x.t4.DeliverId == x.t2.Id) + .GroupBy(x => x.t1.Id) + .WithTempQuery(x => new + { + x.Value.Item1.Id, + Bottlecodes = SqlExt.GroupConcat(x.Value.Item3.BottleCode).ToValue(), + Pbottlecodes = SqlExt.GroupConcat(x.Value.Item4.BottleCode).ToValue() + }); + + //测试任务送样子查询 + var deliverProtocolQuery = fsql.Select() + .WithTempQuery(x => new + { + x.DeliverId, + ProtocolIds = SqlExt.GroupConcat(x.ProtocolId).ToValue() + }); + + //接收状态 + var deliverStatusQuery = fsql.Select() + .LeftJoin(x => x.t1.Id == x.t2.DeliverId) + .LeftJoin(x => x.t3.DeliverId == x.t1.Id) + .Where(x => x.t3.Status != 1); + + //项目信息子查询 + var projectQuery = fsql.Select(); + + var sql1 = fsql.Select() + .FromQuery(deliverInfoQuery, deliverProtocolQuery, projectQuery) + .LeftJoin(x => x.t1.Id == x.t2.Id) + .LeftJoin(x => x.t1.Id == x.t3.DeliverId) + .LeftJoin(x => x.t1.ProjectId == x.t4.Id) + .Page(1, 20) + .ToSql(x => new Issues1467Class.ResponseDeliverInfoDto + { + ProjectCode = x.t4.ProjectCode, + ProjectName = x.t4.ProjectName, + ReceiveStatus = x.t1.Receivestatus == 1 ? x.t1.Receivestatus.Value : fsql.Select() + .LeftJoin(y => y.t1.Id == y.t2.DeliverId) + .LeftJoin(y => y.t3.DeliverId == y.t1.Id) + .Where(y => y.t3.Status != 1) + .Where(y => y.t1.Id == x.t1.Id || y.t1.RefId == x.t1.Id).Count(),//deliverStatusQuery.Where(y => y.t1.Id == x.t1.Id || y.t1.RefId == x.t1.Id).Count(), + RefCount = fsql.Select().Where(y => y.RefId == x.t1.Id).Count() + }); + Assert.Equal(@"SELECT a.`Id` as1, a.`Code` as2, a.`Deliver_Date` as3, a.`Receiver` as4, a.`Creator` as5, a.`CreatorName` as6, a.`Create_Date` as7, a.`ReceiverName` as8, a.`SampleSender` as9, a.`SampleSenderName` as10, a.`Receive_Date` as11, a.`Type` as12, htc.`ProtocolIds` as13, a.`ProjectID` as14, a.`Status` as15, a.`RefuseReason` as16, a.`RefId` as17, htb.`Bottlecodes` as18, htb.`Pbottlecodes` as19, htd.`ProjectCode` as20, htd.`ProjectName` as21, case when a.`Receivestatus` = 1 then a.`Receivestatus` else (SELECT count(1) + FROM `Issues1467Class_deliverinfo` ht1 + LEFT JOIN `Issues1467Class_deliverinfo_bottle` ht2 ON ht1.`Id` = ht2.`DeliverId` + LEFT JOIN `Issues1467Class_biologys` ht3 ON ht3.`DeliverId` = ht1.`Id` + WHERE (ht3.`Status` <> 1) AND ((ht1.`Id` = a.`Id` OR ht1.`RefId` = a.`Id`))) end as22, (SELECT count(1) + FROM `Issues1467Class_deliverinfo` y + WHERE (y.`RefId` = a.`Id`)) as23 +FROM `Issues1467Class_deliverinfo` a +LEFT JOIN ( + SELECT a.`Id`, group_concat(c.`BottleCode`) `Bottlecodes`, group_concat(d.`BottleCode`) `Pbottlecodes` + FROM `Issues1467Class_deliverinfo` a + LEFT JOIN `Issues1467Class_deliverinfo` b ON a.`Id` = b.`RefId` + LEFT JOIN `Issues1467Class_deliverinfo_bottle` c ON c.`DeliverId` = a.`Id` + LEFT JOIN `Issues1467Class_deliverinfo_bottle` d ON d.`DeliverId` = b.`Id` + GROUP BY a.`Id` ) htb ON a.`Id` = htb.`Id` +LEFT JOIN ( + SELECT a.`DeliverID` `DeliverId`, group_concat(a.`ProtocolID`) `ProtocolIds` + FROM `Issues1467Class_deliverinfo_protocols` a ) htc ON a.`Id` = htc.`DeliverId` +LEFT JOIN `Issues1467Class_project` htd ON a.`ProjectID` = htd.`Id` +limit 0,20", sql1); + + var reponse = fsql.Select() + .FromQuery(deliverInfoQuery, deliverProtocolQuery, projectQuery) + .LeftJoin(x => x.t1.Id == x.t2.Id) + .LeftJoin(x => x.t1.Id == x.t3.DeliverId) + .LeftJoin(x => x.t1.ProjectId == x.t4.Id) + .Page(1, 20) + .Count(out var total) + .ToSql(x => new Issues1467Class.ResponseDeliverInfoDto + { + ProjectCode = x.t4.ProjectCode, + ProjectName = x.t4.ProjectName, + ReceiveStatus = x.t1.Receivestatus == 1 ? x.t1.Receivestatus.Value : deliverStatusQuery.Where(y => y.t1.Id == x.t1.Id || y.t1.RefId == x.t1.Id).Count(), + RefCount = fsql.Select().Where(y => y.RefId == x.t1.Id).Count() + }); + } + + #region #1467 class + public class Issues1467Class + { + public class ResponseDeliverInfoDto + { + public string Id { get; set; } + /// + /// 测试任务编号,系统自动生成 + /// + public string Code { get; set; } + /// + /// 送样日期 + /// + public DateTime Deliver_Date { get; set; } + /// + /// 接收人 + /// + public string Receiver { get; set; } + /// + /// 创建人 + /// + public string Creator { get; set; } + /// + /// 提交人 + /// + public string CreatorName { get; set; } + + /// + /// 提交日期 + /// + public DateTime Create_Date { get; set; } + + /// + /// 接收人姓名 + /// + public string ReceiverName { get; set; } + /// + /// 送样人员 + /// + public string SampleSender { get; set; } + /// + /// 送样人员姓名 + /// + public string SampleSenderName { get; set; } + /// + /// 接收日期 + /// + public DateTime? Receive_Date { get; set; } + /// + /// 测试方式(取字典) + /// + public string Type { get; set; } + /// + /// 实验方法ID字符串,以分号间隔 + /// + public string ProtocolIds { get; set; } + /// + /// 项目编号(原为ProjectID) + /// + public string ProjectId { get; set; } + /// + /// 任务状态 + /// + public int Status { get; set; } + /// + /// 接收状态 + /// + public long ReceiveStatus { get; set; } + /// + /// 拒收理由 + /// + public string RefuseReason { get; set; } + /// + /// 分配关联送样Id + /// + public string RefId { get; set; } + /// + /// 分配子任务数量 + /// + public long RefCount { get; set; } + /// + /// 样品编号(目前本身有的) + /// + public string BottleCodes { get; set; } + /// + /// 样品编号(已经被分配出去的) + /// + public string PBottleCodes { get; set; } + /// + /// 项目编号 + /// + public string ProjectCode { get; set; } + /// + /// 项目名称 + /// + public string ProjectName { get; set; } + } + + public class BaseEntity + { + [Column(IsPrimary = true)] + public string Id { get; set; } + /// + /// 版本号 + /// + public string Version { get; set; } + /// + /// 创建者ID + /// + public string Creator { get; set; } + /// + /// 创建人姓名 + /// + public string CreatorName { get; set; } + /// + /// 创建时间 + /// + [Column(ServerTime = DateTimeKind.Local, CanUpdate = false)] + public DateTime Create_Date { get; set; } + /// + /// ip地址 + /// + [Column(Name = "IP_Address")] + public string IpAddress { get; set; } + /// + /// 修改人id + /// + public string Modifier { get; set; } + /// + /// 修改人姓名 + /// + public string ModifierName { get; set; } + /// + /// 修改人ip + /// + public string Modifier_IP { get; set; } + /// + /// 修改时间 + /// + [Column(ServerTime = DateTimeKind.Local)] + public DateTime Modify_Date { get; set; } + /// + /// 审批状态,由审批模块返回 + /// + public int? Auditstatus { get; set; } + /// + /// 信息状态 + /// + public int Status { get; set; } + /// + /// 备注 + /// + public string Comments { get; set; } + /// + /// 组织编码 + /// + public string OrganCode { get; set; } + } + + /// + /// 测试任务表 + /// 主表 + /// + [Table(Name = "Issues1467Class_deliverinfo")] + public class DeliverInfo : BaseEntity + { + /// + /// 测试任务编号,系统自动生成 + /// + public string Code { get; set; } + /// + /// 送样日期 + /// + public DateTime Deliver_Date { get; set; } + /// + /// 接收人 + /// + public string Receiver { get; set; } + /// + /// 接收人姓名 + /// + public string ReceiverName { get; set; } + /// + /// 送样人员 + /// + public string SampleSender { get; set; } + /// + /// 送样人员姓名 + /// + public string SampleSenderName { get; set; } + /// + /// 接收日期 + /// + public DateTime? Receive_Date { get; set; } + /// + /// 测试方式(取字典) + /// + public string Type { get; set; } + /// + /// 项目编号 + /// + [Column(Name = "ProjectID")] + public string ProjectId { get; set; } + /// + /// 接收状态 + /// + public int? Receivestatus { get; set; } + /// + /// 拒收理由 + /// + public string RefuseReason { get; set; } + /// + /// 分配关联送样ID + /// + public string RefId { get; set; } + /// + /// 分配子任务数量 + /// + [Column(IsIgnore = true)] + public int RefCount { get; set; } + /// + /// 自定义表单内容 + /// + public string CustomColumns { get; set; } + } + + /// + /// 送样样品中间表 + /// + [Table(Name = "Issues1467Class_deliverinfo_bottle")] + public class DeliverInfoBottle + { + [Column(IsPrimary = true)] + public string Id { get; set; } + /// + /// 样品编号 + /// + public string BottleCode { get; set; } + /// + /// 送样ID + /// + public string DeliverId { get; set; } + /// + /// 送样量 + /// + public string Amount { get; set; } + } + + /// + /// 测试任务送样方法表 + /// + [Table(Name = "Issues1467Class_deliverinfo_protocols")] + public class DeliverProtocol + { + /// + /// 数据主键 + /// + [Column(IsPrimary = true)] + public string Id { get; set; } + /// + /// 测试任务ID + /// + [Column(Name = "DeliverID")] + public string DeliverId { get; set; } + /// + /// 实验方法ID + /// + [Column(Name = "ProtocolID")] + public string ProtocolId { get; set; } + } + + /// + /// 项目信息 + /// + /// + [Table(Name = "Issues1467Class_project")] + public class Project : BaseEntity + { + /// + /// 项目编号 + /// + public string ProjectCode { get; set; } + /// + /// 项目名称 + /// + public string ProjectName { get; set; } + /// + /// 所属部门 + /// + public string Department { get; set; } + /// + /// 说明 + /// + public string Description { get; set; } + /// + /// 计划开始时间 + /// + public DateTime? StartTime_Plan { get; set; } + /// + /// 计划结束时间 + /// + public DateTime? EndTime_Plan { get; set; } + /// + /// 实际开始时间 + /// + public DateTime? StartTime { get; set; } + /// + /// 实际结束时间 + /// + public DateTime? EndTime { get; set; } + + /// + /// 是否是PM同步过来的 + /// + public int IsSync { get; set; } + + /// + /// PM同步的项目主键信息 + /// + [Column(Name = "RefID")] + public int RefId { get; set; } + /// + /// 是否禁用 1是 0 否 + /// + public int IsDisable { get; set; } + + /// + /// 部门Id + /// + public int DeptId { get; set; } + } + + /// + /// 生物模块信息表 + /// 主表 + /// + [Table(Name = "Issues1467Class_biologys")] + public class Biologys : BaseEntity + { + /// + /// 生物编号,系统自动生成 + /// + public string Code { get; set; } + /// + /// 项目编号 + /// + [Column(Name = "ProjectID")] + public string ProjectId { get; set; } + + /// + /// 样品编号 + /// + public string BottleCode { get; set; } + /// + /// 测试方法Id + /// + [Column(Name = "ProtocolID")] + public string ProtocolId { get; set; } + /// + /// 实验日期 + /// + public DateTime? Experiment_Date { get; set; } + /// + /// 送样日期 + /// + public DateTime? Deliver_Date { get; set; } + /// + /// 测试任务ID + /// + public string DeliverId { get; set; } + /// + /// 测试任务编号 + /// + public string DeliverCode { get; set; } + /// + /// 记录编号 + /// + public string BookNumber { get; set; } + /// + /// 自定义表单数据 + /// + public string CustomColumns { get; set; } + /// + /// 测试类型 + /// + public string BiologyType { get; set; } + } + } + #endregion + [Fact] public void IssuesWithTempQueryAndDto() { diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs index bcab608c..69018e16 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs @@ -281,6 +281,8 @@ namespace FreeSql.ClickHouse var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Custom/CustomExpression.cs b/Providers/FreeSql.Provider.Custom/CustomExpression.cs index b367ad64..03cfc56f 100644 --- a/Providers/FreeSql.Provider.Custom/CustomExpression.cs +++ b/Providers/FreeSql.Provider.Custom/CustomExpression.cs @@ -262,7 +262,10 @@ namespace FreeSql.Custom { case "IsNullOrEmpty": return _utils.Adapter.LambdaString_IsNullOrEmpty(getExp(exp.Arguments[0])); case "IsNullOrWhiteSpace": return _utils.Adapter.LambdaString_IsNullOrWhiteSpace(getExp(exp.Arguments[0])); - case "Concat": return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); + case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); + return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); } } else diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs index a50190b1..6278ba2c 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs @@ -262,6 +262,8 @@ namespace FreeSql.Custom.MySql var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs index 18cd30a7..79c78b4c 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs @@ -266,6 +266,8 @@ namespace FreeSql.Custom.Oracle var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs index 6b33a0eb..084e5428 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs @@ -350,6 +350,8 @@ namespace FreeSql.Custom.PostgreSQL var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs index 3fd9cacf..ad64a574 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs @@ -272,6 +272,8 @@ namespace FreeSql.Custom.SqlServer var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs index 5ff640a9..709cd99c 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs @@ -266,6 +266,8 @@ namespace FreeSql.Dameng var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs index c28b2000..0be85aed 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs @@ -253,6 +253,8 @@ namespace FreeSql.Firebird var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or trim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs index deb0dbdc..13bc26e6 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs @@ -253,6 +253,8 @@ namespace FreeSql.GBase var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or trim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs index 1d2127ad..48162780 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs @@ -328,6 +328,8 @@ namespace FreeSql.KingbaseES var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs index bdea3735..9533376f 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs @@ -236,6 +236,8 @@ namespace FreeSql.MsAccess var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 0506abae..1a318364 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -264,6 +264,8 @@ namespace FreeSql.MySql var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs index 5f768696..24427d6a 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs @@ -266,6 +266,8 @@ namespace FreeSql.Odbc.Dameng var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index 49ca81c2..1ab6ef4d 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -262,7 +262,10 @@ namespace FreeSql.Odbc.Default { case "IsNullOrEmpty": return _utils.Adapter.LambdaString_IsNullOrEmpty(getExp(exp.Arguments[0])); case "IsNullOrWhiteSpace": return _utils.Adapter.LambdaString_IsNullOrWhiteSpace(getExp(exp.Arguments[0])); - case "Concat": return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); + case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); + return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); } } else diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs index 6d36c321..edb4ac56 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs @@ -328,6 +328,8 @@ namespace FreeSql.Odbc.KingbaseES var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index 1e6fdfb8..1c0538a8 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -262,6 +262,8 @@ namespace FreeSql.Odbc.MySql var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index e6b7e9da..23f2bd16 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -266,6 +266,8 @@ namespace FreeSql.Odbc.Oracle var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index b5d78775..8bac205c 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -350,6 +350,8 @@ namespace FreeSql.Odbc.PostgreSQL var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index 6a938b37..a342d154 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -272,6 +272,8 @@ namespace FreeSql.Odbc.SqlServer var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 0fa8869f..8a5396bc 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -266,6 +266,8 @@ namespace FreeSql.Oracle var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index b9b8add0..d5446a66 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -381,6 +381,8 @@ namespace FreeSql.PostgreSQL var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs index b71f1135..81fe2339 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs @@ -433,6 +433,8 @@ namespace FreeSql.QuestDb var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs index 32051a6b..f2a7f203 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs @@ -310,6 +310,8 @@ namespace FreeSql.ShenTong var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 7ea9853a..71549e7b 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -271,6 +271,8 @@ namespace FreeSql.SqlServer var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), concatNewArrExp.Expressions.Select(a => a.Type).ToArray()); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), exp.Arguments.Select(a => a.Type).ToArray()); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0])); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 9a3bb1d0..28e69ed5 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -262,6 +262,8 @@ namespace FreeSql.Sqlite var arg2 = getExp(exp.Arguments[0]); return $"({arg2} is null or {arg2} = '' or ltrim({arg2}) = '')"; case "Concat": + if (exp.Arguments.Count == 1 && exp.Arguments[0].NodeType == ExpressionType.NewArrayInit && exp.Arguments[0] is NewArrayExpression concatNewArrExp) + return _common.StringConcat(concatNewArrExp.Expressions.Select(a => getExp(a)).ToArray(), null); return _common.StringConcat(exp.Arguments.Select(a => getExp(a)).ToArray(), null); case "Format": if (exp.Arguments[0].NodeType != ExpressionType.Constant) throw new Exception(CoreStrings.Not_Implemented_Expression_ParameterUseConstant(exp,exp.Arguments[0]));