diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 4854f49c..474ea8d5 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -486,14 +486,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index f2304308..f117bdd9 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -1990,34 +1990,34 @@ WHERE (((a.""Code"") LIKE '%val1%' AND (a.""Name"") LIKE 'val2%' OR (a.""Name"") { ""Field"" : ""CreateTime"", ""Operator"" : ""DateRange"", - ""Value"" : ""2010-10-10,2010-11-10"" + ""Value"" : [""2010-10-10"", ""2010-11-10""] }, { ""Field"" : ""CreateTime"", ""Operator"" : ""DateRange"", - ""Value"" : ""2010-10-10,2010-11"" + ""Value"" : ""2010-10,2010-11"" }, { ""Field"" : ""CreateTime"", ""Operator"" : ""DateRange"", - ""Value"" : ""2010-10-10,2010"" + ""Value"" : ""2010,2010"" }, { ""Field"" : ""CreateTime"", ""Operator"" : ""DateRange"", - ""Value"" : ""2010-10-10,2010-11-10 11"" + ""Value"" : ""2010-10-10 11,2010-11-10 11"" }, { ""Field"" : ""CreateTime"", ""Operator"" : ""DateRange"", - ""Value"" : ""2010-10-10,2010-11-10 11:20"" + ""Value"" : ""2010-10-10 11:20,2010-11-10 11:20"" }, ] } ")).ToSql(); Assert.Equal(@"SELECT a.""Code"", a.""Name"", a.""CreateTime"", a.""testint"", a.""ParentCode"" FROM ""D_District"" a -WHERE ((a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2010-11-11 00:00:00' OR a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2010-12-01 00:00:00' OR a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2011-01-01 00:00:00' OR a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2010-11-10 12:00:00' OR a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2010-11-10 11:21:00'))", sql); +WHERE ((a.""CreateTime"" >= '2010-10-10 00:00:00' AND a.""CreateTime"" < '2010-11-11 00:00:00' OR a.""CreateTime"" >= '2010-10-01 00:00:00' AND a.""CreateTime"" < '2010-12-01 00:00:00' OR a.""CreateTime"" >= '2010-01-01 00:00:00' AND a.""CreateTime"" < '2011-01-01 00:00:00' OR a.""CreateTime"" >= '2010-10-10 11:00:00' AND a.""CreateTime"" < '2010-11-10 12:00:00' OR a.""CreateTime"" >= '2010-10-10 11:20:00' AND a.""CreateTime"" < '2010-11-10 11:21:00'))", sql); sql = fsql.Select().WhereDynamicFilter(JsonConvert.DeserializeObject(@" { diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index f4037586..5841a265 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -1,5 +1,6 @@ using FreeSql.Internal.Model; using System; +using System.Collections; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -1102,34 +1103,54 @@ namespace FreeSql.Internal.CommonProvider case DynamicFilterOperator.LessThan: exp = Expression.LessThan(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type)); break; case DynamicFilterOperator.LessThanOrEqual: exp = Expression.LessThanOrEqual(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type)); break; case DynamicFilterOperator.Range: - var fiValueRangeArray = fi.Value.Split(','); + var fiValueRangeArray = getFiListValue(); if (fiValueRangeArray.Length != 2) throw new ArgumentException($"Range 要求 Value 应该逗号分割,并且长度为 2"); exp = Expression.AndAlso( Expression.GreaterThanOrEqual(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fiValueRangeArray[0]), exp.Type)), Expression.LessThan(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fiValueRangeArray[1]), exp.Type))); break; case DynamicFilterOperator.DateRange: - var fiValueDateRangeArray = fi.Value.Split(','); - if (fiValueDateRangeArray.Length != 2) throw new ArgumentException($"DateRange 要求 Value 应该逗号分割,并且长度为 2"); + var fiValueDateRangeArray = getFiListValue(); + if (fiValueDateRangeArray?.Length != 2) throw new ArgumentException($"DateRange 要求 Value 应该逗号分割,并且长度为 2"); if (Regex.IsMatch(fiValueDateRangeArray[1], @"^\d\d\d\d[\-/]\d\d?[\-/]\d\d?$")) fiValueDateRangeArray[1] = DateTime.Parse(fiValueDateRangeArray[1]).AddDays(1).ToString("yyyy-MM-dd HH:mm:ss"); else if (Regex.IsMatch(fiValueDateRangeArray[1], @"^\d\d\d\d[\-/]\d\d?$")) fiValueDateRangeArray[1] = DateTime.Parse($"{fiValueDateRangeArray[1]}-01").AddMonths(1).ToString("yyyy-MM-dd HH:mm:ss"); else if (Regex.IsMatch(fiValueDateRangeArray[1], @"^\d\d\d\d$")) fiValueDateRangeArray[1] = DateTime.Parse($"{fiValueDateRangeArray[1]}-01-01").AddYears(1).ToString("yyyy-MM-dd HH:mm:ss"); else if (Regex.IsMatch(fiValueDateRangeArray[1], @"^\d\d\d\d[\-/]\d\d?[\-/]\d\d? \d\d?$")) fiValueDateRangeArray[1] = DateTime.Parse($"{fiValueDateRangeArray[1]}:00:00").AddHours(1).ToString("yyyy-MM-dd HH:mm:ss"); else if (Regex.IsMatch(fiValueDateRangeArray[1], @"^\d\d\d\d[\-/]\d\d?[\-/]\d\d? \d\d?:\d\d?$")) fiValueDateRangeArray[1] = DateTime.Parse($"{fiValueDateRangeArray[1]}:00").AddMinutes(1).ToString("yyyy-MM-dd HH:mm:ss"); else throw new ArgumentException($"DateRange 要求 Value[1] 格式必须为:yyyy、yyyy-MM、yyyy-MM-dd、yyyy-MM-dd HH、yyyy、yyyy-MM-dd HH:mm"); + + if (Regex.IsMatch(fiValueDateRangeArray[0], @"^\d\d\d\d[\-/]\d\d?$")) fiValueDateRangeArray[0] = DateTime.Parse($"{fiValueDateRangeArray[0]}-01").ToString("yyyy-MM-dd HH:mm:ss"); + else if (Regex.IsMatch(fiValueDateRangeArray[0], @"^\d\d\d\d$")) fiValueDateRangeArray[0] = DateTime.Parse($"{fiValueDateRangeArray[0]}-01-01").ToString("yyyy-MM-dd HH:mm:ss"); + else if (Regex.IsMatch(fiValueDateRangeArray[0], @"^\d\d\d\d[\-/]\d\d?[\-/]\d\d? \d\d?$")) fiValueDateRangeArray[0] = DateTime.Parse($"{fiValueDateRangeArray[0]}:00:00").ToString("yyyy-MM-dd HH:mm:ss"); + else if (Regex.IsMatch(fiValueDateRangeArray[0], @"^\d\d\d\d[\-/]\d\d?[\-/]\d\d? \d\d?:\d\d?$")) fiValueDateRangeArray[0] = DateTime.Parse($"{fiValueDateRangeArray[0]}:00").ToString("yyyy-MM-dd HH:mm:ss"); + exp = Expression.AndAlso( Expression.GreaterThanOrEqual(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fiValueDateRangeArray[0]), exp.Type)), Expression.LessThan(exp, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fiValueDateRangeArray[1]), exp.Type))); break; case DynamicFilterOperator.Any: case DynamicFilterOperator.NotAny: - var fiValueAnyArray = fi.Value.Split(','); + var fiValueAnyArray = getFiListValue(); + if (fiValueAnyArray.Length == 0) break; var fiValueAnyArrayType = exp.Type.MakeArrayType(); exp = Expression.Call(GetMethodEnumerableContains(exp.Type), Expression.Constant(Utils.GetDataReaderValue(fiValueAnyArrayType, fiValueAnyArray), fiValueAnyArrayType), exp); if (fi.Operator == DynamicFilterOperator.NotAny) exp = Expression.Not(exp); break; } + string[] getFiListValue() + { + if (fi.Value is string fiValueString) return fiValueString.Split(','); + if (fi.Value is IEnumerable fiValueIe) + { + var fiValueList = new List(); + foreach (var fiValueIeItem in fiValueIe) + fiValueList.Add(string.Concat(fiValueIeItem)); + return fiValueList.ToArray(); + } + return new string[0]; + } + var sql = _commonExpression.ExpressionWhereLambda(_tables, exp, null, null, _params); sb.Append(sql); diff --git a/FreeSql/Internal/Model/DynamicFilterInfo.cs b/FreeSql/Internal/Model/DynamicFilterInfo.cs index 892e6755..64adb791 100644 --- a/FreeSql/Internal/Model/DynamicFilterInfo.cs +++ b/FreeSql/Internal/Model/DynamicFilterInfo.cs @@ -28,7 +28,7 @@ namespace FreeSql.Internal.Model /// /// 值 /// - public string Value { get; set; } + public object Value { get; set; } /// /// Filters 下的逻辑运算符 @@ -93,13 +93,13 @@ namespace FreeSql.Internal.Model /// /// >= and < - /// 此时 Value 的值格式为逗号分割:value1,value2 + /// 此时 Value 的值格式为逗号分割:value1,value2 或者数组 /// Range, /// /// >= and < - /// 此时 Value 的值格式为逗号分割:date1,date2 + /// 此时 Value 的值格式为逗号分割:date1,date2 或者数组 /// 这是专门为日期范围查询定制的操作符,它会处理 date2 + 1,比如: /// 当 date2 选择的是 2020-05-30,那查询的时候是 < 2020-05-31 /// 当 date2 选择的是 2020-05,那查询的时候是 < 2020-06 @@ -112,12 +112,12 @@ namespace FreeSql.Internal.Model /// /// in (1,2,3) - /// 此时 Value 的值格式为逗号分割:value1,value2,value3... + /// 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 /// Any, /// /// not in (1,2,3) - /// 此时 Value 的值格式为逗号分割:value1,value2,value3... + /// 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组 /// NotAny }