Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c语言中具有多个列名的Linq排序#_C#_Sql_Linq_Sorting_Entity Framework 4 - Fatal编程技术网

C# c语言中具有多个列名的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

我想用Linq对多个列进行排序

我用于参考,用于按列名对单个列进行排序

我尝试使用此方法对具有列名的多个列进行排序

以下是我目前正在做的事情

  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.IOrderedQueryable
1[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);