【FreeSql】 实现动态排序(order by)

博客内容讲述了在使用FreeSql时遇到的ISelectGrouping缺少OrderByIf等排序方法的问题。作者分享了如何通过自定义表达式函数来实现动态排序,并提供了一个示例代码,展示了根据条件选择不同排序字段的方法。同时,作者提到在GitHub上已有人提出相关issue,期待官方能增加更多对ISelectGrouping的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我有一个场景

条件1:order by 1,2,3

条件2:order by 2,1,3

条件3: order by 3,1,2

如果用

.OrderByPropertyNameIf(bool condition,string property,[bool isAscending=true])
按属性名字符串排序

这个方法就很好解决我的需求。

但是目前freesql的ISelectGrouping 没有这个方法。(本地版本为3.2.640)

看到在GitHub有位同学提了个issues,希望能以后提供IselectGrouping更多的支持,目前就是硬撸的。

目前 ISelect 有以下排序函数:
OrderBy(bool condition, string sql, object parms = null);
OrderBy(string sql, object parms = null);
OrderByPropertyName(string property, bool isAscending = true);
OrderByPropertyNameIf(bool condition, string property, bool isAscending = true);
OrderByDescending(Expression<Func<T1, TMember>> column);
OrderByIf(bool condition, Expression<Func<T1, TMember>> column, bool descending = false);

希望 ISelectGrouping<TKey, TEntity> 也能有
OrderBy(bool condition, string sql, object parms = null);
OrderBy(string sql, object parms = null);
OrderBy(Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column, bool descending = false);
OrderByIf(bool condition, Expression<Func<ISelectGroupingAggregate<TKey, TValue>, TMember>> column, bool descending = false);
OrderByPropertyName(string property, bool isAscending = true);
OrderByPropertyNameIf(bool condition, string property, bool isAscending = true);

(链接如下) 

https://github.com/dotnetcore/FreeSql/issues/619icon-default.png?t=O83Ahttps://github.com/dotnetcore/FreeSql/issues/619

 实现orderby、orderbydescending需要的参数。(表达式函数)

private Expression<Func<ISelectGroupingAggregate<Dto,NativeTuple<model1,model2,model3>>,devimal>>
GetOrderbyExpression(int order,int fieldorder)
{
Expression<Func<ISelectGroupingAggregate<Dto,NativeTuple<model1,model2,model3>>,devimal>> expression=null;
Expression<Func<ISelectGroupingAggregate<Dto,NativeTuple<model1,model2,model3>>,devimal>> expression1=x=>x.order1;
Expression<Func<ISelectGroupingAggregate<Dto,NativeTuple<model1,model2,model3>>,devimal>> expression2=x=>x.order2;
Expression<Func<ISelectGroupingAggregate<Dto,NativeTuple<model1,model2,model3>>,devimal>> expression3=x=>x.order3;

switch(order){
 case 1:
   if(fieldorder==1)
     expression=expression1;
  if(fieldorder==2)
     expression=expression2;
  if(fieldorder==3)
     expression=expression3;
  break;
case 2:
   if(fieldorder==1)
     expression=expression2;
  if(fieldorder==2)
     expression=expression1;
  if(fieldorder==3)
     expression=expression3;
   break;
case 3:
   if(fieldorder==1)
     expression=expression3;
  if(fieldorder==2)
     expression=expression2;
  if(fieldorder==3)
     expression=expression1;
  break;
}
return expression;
}

代码如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值