我有一个场景
条件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/619https://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;
}
代码如下