- 增加 WhereDynamicFilter 操作符 DateRange,日期范围查询;

This commit is contained in:
28810
2020-06-01 12:46:57 +08:00
parent 4dd4f23257
commit 43e2af2bee
4 changed files with 78 additions and 1 deletions

View File

@ -3119,6 +3119,19 @@
此时 Value 的值格式为逗号分割value1,value2
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.DateRange">
<summary>
&gt;= and &lt;<para></para>
此时 Value 的值格式为逗号分割date1,date2<para></para>
这是专门为日期范围查询定制的操作符,它会处理 date2 + 1比如<para></para>
当 date2 选择的是 2020-05-30那查询的时候是 &lt; 2020-05-31<para></para>
当 date2 选择的是 2020-05那查询的时候是 &lt; 2020-06<para></para>
当 date2 选择的是 2020那查询的时候是 &lt; 2021<para></para>
当 date2 选择的是 2020-05-30 12那查询的时候是 &lt; 2020-05-30 13<para></para>
当 date2 选择的是 2020-05-30 12:30那查询的时候是 &lt; 2020-05-30 12:31<para></para>
并且 date2 只支持以上 5 种格式 (date1 没有限制)
</summary>
</member>
<member name="F:FreeSql.Internal.Model.DynamicFilterOperator.Any">
<summary>
in (1,2,3)<para></para>

View File

@ -10,6 +10,7 @@ using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
@ -1102,11 +1103,24 @@ namespace FreeSql.Internal.CommonProvider
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(',');
if (fiValueRangeArray.Length != 2) throw new ArgumentException($"Range 对应 Value 应该逗号分割,并且长度为 2");
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");
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");
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:
var fiValueAnyArray = fi.Value.Split(',');
var fiValueAnyArrayType = exp.Type.MakeArrayType();

View File

@ -97,6 +97,19 @@ namespace FreeSql.Internal.Model
/// </summary>
Range,
/// <summary>
/// &gt;= and &lt;<para></para>
/// 此时 Value 的值格式为逗号分割date1,date2<para></para>
/// 这是专门为日期范围查询定制的操作符,它会处理 date2 + 1比如<para></para>
/// 当 date2 选择的是 2020-05-30那查询的时候是 &lt; 2020-05-31<para></para>
/// 当 date2 选择的是 2020-05那查询的时候是 &lt; 2020-06<para></para>
/// 当 date2 选择的是 2020那查询的时候是 &lt; 2021<para></para>
/// 当 date2 选择的是 2020-05-30 12那查询的时候是 &lt; 2020-05-30 13<para></para>
/// 当 date2 选择的是 2020-05-30 12:30那查询的时候是 &lt; 2020-05-30 12:31<para></para>
/// 并且 date2 只支持以上 5 种格式 (date1 没有限制)
/// </summary>
DateRange,
/// <summary>
/// in (1,2,3)<para></para>
/// 此时 Value 的值格式为逗号分割value1,value2,value3...