Entity framework 对不确定数量的列进行排序/排序(LINQ\Entity Framework)

Entity framework 对不确定数量的列进行排序/排序(LINQ\Entity Framework),entity-framework,linq,entity-framework-6,sql-order-by,Entity Framework,Linq,Entity Framework 6,Sql Order By,需要根据未确定的列数(1或更多)对数据列表进行排序/排序 我试图做的是循环遍历所需的列,然后根据它们的编号向查询列表中添加OrderBy或ThenBy,但我没有成功 已完成此操作,但未编译: var query = GetAllItems(); //returns a IQueriable list of items //for each selected column for (int i = 0; i < param.Columns.Length; i++) { if (i

需要根据未确定的列数(1或更多)对数据列表进行排序/排序

我试图做的是循环遍历所需的列,然后根据它们的编号向查询列表中添加OrderBy或ThenBy,但我没有成功

已完成此操作,但未编译:

var query = GetAllItems(); //returns a IQueriable list of items

//for each selected column
for (int i = 0; i < param.Columns.Length; i++)
{
    if (i == 0)
    {
        query = query.OrderBy(x => x.GetType().GetProperty(param.Columns[i].Name));
    }
    else
    {
        //ERROR: IQueriable does not contain a definition for "ThenBy" and no extension method "ThenBy"...
        query = query.ThenBy(x => x.GetType().GetProperty(param.Columns[i].Data));
    }
}
更新代码:

var query = GetAllItems(); //returns a IQueriable list of items

List<string> orderByColumnList = new List<string>(); //list of columns to sort

for (int i = 0; i < param.Columns.Length; i++)
{
    string column = param.Columns[i].Name;
    string direction = param.Columns[i].Dir;

    //ex.: "columnA ASC"
    string orderByColumn = column + " " + direction;

    //add column to list
    orderByColumnList.Add(orderBy);
}

//convert list to comma delimited string
string orderBy = String.Join(",", orderByColumnList.ToArray());

//sort by all columns, yay! :-D
query.OrderBy(orderBy).ToList();
var query=GetAllItems()//返回可编辑的项目列表
List orderByColumnList=新列表()//要排序的列的列表
for(int i=0;i
您应该在OrderBy之后再这样写:

query = query
           .OrderBy(t=> // your condition)
           .ThenBy(t=> // next condition);

您应该在OrderBy之后再这样写:

query = query
           .OrderBy(t=> // your condition)
           .ThenBy(t=> // next condition);

问题在于ThenBy不是在IQueryable上定义的,而是在IOrderedQueryable接口上定义的(这是返回的)。因此,您需要为IOrderedQueryable定义一个新变量,以便执行后续的ThenBy调用。我稍微修改了原始代码以使用System.Data.DataTable(以获得与“param”对象类似的结构)。代码还假定DataTable中至少有一列

// using System.Data.DataTable to provide similar object structure as OP
DataTable param = new DataTable();
IQueryable<DataTable> query = new List<DataTable>().AsQueryable();

// OrderBy returns IOrderedQueryable<TSource>, which is the interface that defines
// "ThenBy" so we need to assign it to a different variable if we wish to make subsequent
// calls to ThenBy
var orderedQuery = query.OrderBy(x => x.GetType().GetProperty(param.Columns[0].ColumnName));

//for each other selected column
for (int i = 1; i < param.Columns.Count; i++)
{
    orderedQuery = orderedQuery.ThenBy(x => x.GetType().GetProperty(param.Columns[i].ColumnName));
}
//使用System.Data.DataTable提供与OP类似的对象结构
DataTable param=新的DataTable();
IQueryable query=new List().AsQueryable();
//OrderBy返回IOrderedQueryable,这是定义
//“ThenBy”,因此如果我们希望进行后续操作,则需要将其分配给另一个变量
//打电话给ThenBy
var orderedQuery=query.OrderBy(x=>x.GetType().GetProperty(param.Columns[0].ColumnName));
//对于其他选定列
对于(int i=1;ix.GetType().GetProperty(param.Columns[i].ColumnName));
}

问题在于,ThenBy不是在IQueryable上定义的,而是在IOrderedQueryable接口上定义的(这是返回的)。因此,您需要为IOrderedQueryable定义一个新变量,以便执行后续的ThenBy调用。我稍微修改了原始代码以使用System.Data.DataTable(以获得与“param”对象类似的结构)。代码还假定DataTable中至少有一列

// using System.Data.DataTable to provide similar object structure as OP
DataTable param = new DataTable();
IQueryable<DataTable> query = new List<DataTable>().AsQueryable();

// OrderBy returns IOrderedQueryable<TSource>, which is the interface that defines
// "ThenBy" so we need to assign it to a different variable if we wish to make subsequent
// calls to ThenBy
var orderedQuery = query.OrderBy(x => x.GetType().GetProperty(param.Columns[0].ColumnName));

//for each other selected column
for (int i = 1; i < param.Columns.Count; i++)
{
    orderedQuery = orderedQuery.ThenBy(x => x.GetType().GetProperty(param.Columns[i].ColumnName));
}
//使用System.Data.DataTable提供与OP类似的对象结构
DataTable param=新的DataTable();
IQueryable query=new List().AsQueryable();
//OrderBy返回IOrderedQueryable,这是定义
//“ThenBy”,因此如果我们希望进行后续操作,则需要将其分配给另一个变量
//打电话给ThenBy
var orderedQuery=query.OrderBy(x=>x.GetType().GetProperty(param.Columns[0].ColumnName));
//对于其他选定列
对于(int i=1;ix.GetType().GetProperty(param.Columns[i].ColumnName));
}

谢谢@Dave,它能完成任务。只有一个小细节使事情无法正常进行。要使订单发生并实际执行,查询必须使用.ToList()。但是当使用ToList()时,它会再次崩溃…谢谢@Dave,它完成了任务。只有一个小细节使事情无法正常进行。要使订单发生并实际执行,查询必须使用.ToList()。但是当使用ToList()时,它又会崩溃……我知道,我的主要问题是对未定义的列数进行动态操作。我知道,我的主要问题是对未定义的列数进行动态操作。