C# c语言中具有多个列名的Linq排序#
我想用Linq对多个列进行排序 我用于参考,用于按列名对单个列进行排序 我尝试使用此方法对具有列名的多个列进行排序 以下是我目前正在做的事情C# c语言中具有多个列名的Linq排序#,c#,sql,linq,sorting,entity-framework-4,C#,Sql,Linq,Sorting,Entity Framework 4,我想用Linq对多个列进行排序 我用于参考,用于按列名对单个列进行排序 我尝试使用此方法对具有列名的多个列进行排序 以下是我目前正在做的事情 public static IQueryable<T> OrderByMultipleFields<T>(this IQueryable<T> q, Dictionary<string, bool> fieldsToSort) { var param = Expression.Paramete
public static IQueryable<T> OrderByMultipleFields<T>(this IQueryable<T> q, Dictionary<string, bool> fieldsToSort)
{
var param = Expression.Parameter(typeof(T), "p");
var prop = Expression.Property(param, fieldsToSort.First().Key);
var exp = Expression.Lambda(prop, param);
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
string method=string.Empty;
Type[] types = new Type[] { q.ElementType, exp.Body.Type };
var mce = q.Expression;
int count = 0;
foreach (var fieldName in fieldsToSort)
{
method = fieldName.Value ? methodAsc : methodDesc;
prop = Expression.Property(param, fieldName.Key);
exp = Expression.Lambda(prop, param);
types = new Type[] { q.ElementType, exp.Body.Type };
if (count == 0) {
mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
} else {
mce = Expression.Add(mce, Expression.Call(typeof(Queryable), method, types, q.Expression, exp));
}
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
count++;
}
return q.Provider.CreateQuery<T>(mce);
}
公共静态IQueryable OrderByMultipleFields(此IQueryable q,Dictionary字段stosort)
{
var param=表达式参数(类型(T),“p”);
var prop=Expression.Property(param,fieldsToSort.First().Key);
var exp=表达式Lambda(prop,param);
string methodAsc=“OrderBy”;
string methodDesc=“OrderByDescending”;
string方法=string.Empty;
类型[]类型=新类型[]{q.ElementType,exp.Body.Type};
var mce=q.表达式;
整数计数=0;
foreach(fieldsToSort中的变量fieldName)
{
method=fieldName.Value?methodAsc:methodDesc;
prop=Expression.Property(参数,fieldName.Key);
exp=表达式Lambda(prop,param);
types=新类型[]{q.ElementType,exp.Body.Type};
如果(计数=0){
mce=Expression.Call(typeof(Queryable),方法,类型,q.Expression,exp);
}否则{
mce=Expression.Add(mce,Expression.Call(typeof(Queryable),method,types,q.Expression,exp));
}
methodAsc=“ThenBy”;
methodDesc=“然后按降序”;
计数++;
}
返回q.Provider.CreateQuery(mce);
}
我得到以下错误-
未为类型定义二进制运算符Add
'System.Linq.IOrderedQueryable1[SortDemo.Data.User]”和
'System.Linq.IOrderedQueryable
1[SortDemo.Data.User]'
实现这一点的正确方法是什么,或者是否有其他方法或方法。
谢谢。首先不清楚您为什么要调用
Add
。在普通排序代码中没有加法运算,因此表达式树形式中也没有加法运算
我怀疑你只是想替换这个:
if (count == 0)
{
mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
}
else {
mce = Expression.Add(mce, Expression.Call(typeof(Queryable), method, types, q.Expression, exp));
}
与:
我还建议将方法
、类型
、exp
和道具
的声明移动到循环内部,以及。。。并删除计数
。这将给您留下:
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
var mce = q.Expression;
foreach (var fieldName in fieldsToSort)
{
var method = fieldName.Value ? methodAsc : methodDesc;
var prop = Expression.Property(param, fieldName.Key);
var exp = Expression.Lambda(prop, param);
var types = new Type[] { q.ElementType, exp.Body.Type };
mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return q.Provider.CreateQuery<T>(mce);
string方法asc=“OrderBy”;
string methodDesc=“OrderByDescending”;
var mce=q.表达式;
foreach(fieldsToSort中的变量fieldName)
{
var method=fieldName.Value?methodAsc:methodDesc;
var prop=Expression.Property(param,fieldName.Key);
var exp=表达式Lambda(prop,param);
var types=新类型[]{q.ElementType,exp.Body.Type};
mce=Expression.Call(typeof(Queryable),方法,类型,q.Expression,exp);
methodAsc=“ThenBy”;
methodDesc=“然后按降序”;
}
返回q.Provider.CreateQuery(mce);
我没有试过,但它比你以前的更有价值
另一个要考虑的不是建立像这样的整个表达式树,而是通过反射直接调用适当的<代码>可查询的< /代码>方法。然后,您只需在任何时候建立一个属性访问表达式树。
那么,为什么您要尝试调用表达式。添加?我知道那里不需要它,但我只是发布了我的代码,以显示我正在尝试的内容。@NikhilChavan:但您为什么要尝试它?如果您知道一个不必要的操作正在给您带来问题,为什么不直接删除它呢?查看我的编辑示例代码。谢谢你的建议,我将尝试你的建议并检查是否有效。谢谢
string methodAsc = "OrderBy";
string methodDesc = "OrderByDescending";
var mce = q.Expression;
foreach (var fieldName in fieldsToSort)
{
var method = fieldName.Value ? methodAsc : methodDesc;
var prop = Expression.Property(param, fieldName.Key);
var exp = Expression.Lambda(prop, param);
var types = new Type[] { q.ElementType, exp.Body.Type };
mce = Expression.Call(typeof(Queryable), method, types, q.Expression, exp);
methodAsc = "ThenBy";
methodDesc = "ThenByDescending";
}
return q.Provider.CreateQuery<T>(mce);