Skip to content

Commit

Permalink
feat(FreeSqlExtensions): support CustomPredicate custom convert (#4300)
Browse files Browse the repository at this point in the history
* 增加 FreeSqlExtensions.ToDynamicFilter 扩展方法自定义转换参数。

* refactor: 重新设计转换逻辑

* chore: bump version 8.2.1

* doc: 更新错误提示信息

---------

Co-authored-by: Argo-AscioTech <[email protected]>
  • Loading branch information
AiYuZhen and ArgoZhang authored Sep 13, 2024
1 parent 264f7b5 commit c58ea05
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<Version>8.2.0</Version>
<Version>8.2.1</Version>
</PropertyGroup>

<PropertyGroup>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,9 @@ public static class FreeSqlExtensions
/// QueryPageOptions 转化为 FreeSql ORM DynamicFilterInfo 类型扩展方法
/// </summary>
/// <param name="option"></param>
/// <param name="dynamicFilterInfoConverter">当 <see cref="FilterAction"/> 的枚举值为 <see cref="FilterAction.CustomPredicate"/> 时的自定义转换方法。</param>
/// <returns></returns>
public static DynamicFilterInfo ToDynamicFilter(this QueryPageOptions option)
public static DynamicFilterInfo ToDynamicFilter(this QueryPageOptions option, Func<FilterKeyValueAction, DynamicFilterInfo>? dynamicFilterInfoConverter = null)
{
var ret = new DynamicFilterInfo() { Filters = [] };

Expand All @@ -27,26 +28,26 @@ public static DynamicFilterInfo ToDynamicFilter(this QueryPageOptions option)
ret.Filters.Add(new()
{
Logic = DynamicFilterLogic.Or,
Filters = option.Searches.Select(i => i.ToDynamicFilter()).ToList()
Filters = option.Searches.Select(i => i.ToDynamicFilter(dynamicFilterInfoConverter)).ToList()
});
}

// 处理自定义搜索
if (option.CustomerSearches.Count > 0)
{
ret.Filters.AddRange(option.CustomerSearches.Select(i => i.ToDynamicFilter()));
ret.Filters.AddRange(option.CustomerSearches.Select(i => i.ToDynamicFilter(dynamicFilterInfoConverter)));
}

// 处理高级搜索
if (option.AdvanceSearches.Count > 0)
{
ret.Filters.AddRange(option.AdvanceSearches.Select(i => i.ToDynamicFilter()));
ret.Filters.AddRange(option.AdvanceSearches.Select(i => i.ToDynamicFilter(dynamicFilterInfoConverter)));
}

// 处理表格过滤条件
if (option.Filters.Count > 0)
{
ret.Filters.AddRange(option.Filters.Select(i => i.ToDynamicFilter()));
ret.Filters.AddRange(option.Filters.Select(i => i.ToDynamicFilter(dynamicFilterInfoConverter)));
}
return ret;
}
Expand All @@ -55,21 +56,27 @@ public static DynamicFilterInfo ToDynamicFilter(this QueryPageOptions option)
/// IFilterAction 转化为 DynamicFilterInfo 扩展方法
/// </summary>
/// <param name="filter"></param>
/// <param name="dynamicFilterInfoConverter">当 <see cref="FilterAction"/> 的枚举值为 <see cref="FilterAction.CustomPredicate"/> 时的自定义转换方法。</param>
/// <returns></returns>
public static DynamicFilterInfo ToDynamicFilter(this IFilterAction filter)
public static DynamicFilterInfo ToDynamicFilter(this IFilterAction filter, Func<FilterKeyValueAction, DynamicFilterInfo>? dynamicFilterInfoConverter = null)
{
var filterKeyValueAction = filter.GetFilterConditions();
return filterKeyValueAction.ParseDynamicFilterInfo();
return filterKeyValueAction.ParseDynamicFilterInfo(dynamicFilterInfoConverter);
}

private static DynamicFilterInfo ParseDynamicFilterInfo(this FilterKeyValueAction filterKeyValueAction) => new()
private static DynamicFilterInfo ParseDynamicFilterInfo(this FilterKeyValueAction filterKeyValueAction, Func<FilterKeyValueAction, DynamicFilterInfo>? dynamicFilterInfoConverter = null)
{
Operator = filterKeyValueAction.FilterAction.ToDynamicFilterOperator(),
Logic = filterKeyValueAction.FilterLogic.ToDynamicFilterLogic(),
Field = filterKeyValueAction.FieldKey,
Value = filterKeyValueAction.FieldValue,
Filters = filterKeyValueAction.Filters?.Select(i => i.ParseDynamicFilterInfo()).ToList()
};
return filterKeyValueAction.FilterAction == FilterAction.CustomPredicate
? dynamicFilterInfoConverter?.Invoke(filterKeyValueAction) ?? throw new InvalidOperationException("The parameter dynamicFilterInfoConverter can't not null")
: new()
{
Operator = filterKeyValueAction.FilterAction.ToDynamicFilterOperator(),
Logic = filterKeyValueAction.FilterLogic.ToDynamicFilterLogic(),
Field = filterKeyValueAction.FieldKey,
Value = filterKeyValueAction.FieldValue,
Filters = filterKeyValueAction.Filters?.Select(i => i.ParseDynamicFilterInfo(dynamicFilterInfoConverter)).ToList()
};
}

private static DynamicFilterLogic ToDynamicFilterLogic(this FilterLogic logic) => logic switch
{
Expand All @@ -87,6 +94,6 @@ public static DynamicFilterInfo ToDynamicFilter(this IFilterAction filter)
FilterAction.GreaterThanOrEqual => DynamicFilterOperator.GreaterThanOrEqual,
FilterAction.LessThan => DynamicFilterOperator.LessThan,
FilterAction.LessThanOrEqual => DynamicFilterOperator.LessThanOrEqual,
_ => throw new NotSupportedException()
_ => throw new NotSupportedException("Please use the ToDynamicFilter method second parameter to support CustomPredicate")
};
}

0 comments on commit c58ea05

Please sign in to comment.