mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 优化 WhereDynamicFilter Value 支持数组或字符串;
This commit is contained in:
		@@ -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<string>();
 | 
			
		||||
                            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);
 | 
			
		||||
 
 | 
			
		||||
@@ -28,7 +28,7 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// 值
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        public string Value { get; set; }
 | 
			
		||||
        public object Value { get; set; }
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// Filters 下的逻辑运算符
 | 
			
		||||
@@ -93,13 +93,13 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// >= and <<para></para>
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2 或者数组
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Range,
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// >= and <<para></para>
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:date1,date2<para></para>
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:date1,date2 或者数组<para></para>
 | 
			
		||||
        /// 这是专门为日期范围查询定制的操作符,它会处理 date2 + 1,比如:<para></para>
 | 
			
		||||
        /// 当 date2 选择的是 2020-05-30,那查询的时候是 < 2020-05-31<para></para>
 | 
			
		||||
        /// 当 date2 选择的是 2020-05,那查询的时候是 < 2020-06<para></para>
 | 
			
		||||
@@ -112,12 +112,12 @@ namespace FreeSql.Internal.Model
 | 
			
		||||
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// in (1,2,3)<para></para>
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2,value3...
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        Any,
 | 
			
		||||
        /// <summary>
 | 
			
		||||
        /// not in (1,2,3)<para></para>
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2,value3...
 | 
			
		||||
        /// 此时 Value 的值格式为逗号分割:value1,value2,value3... 或者数组
 | 
			
		||||
        /// </summary>
 | 
			
		||||
        NotAny
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user