如何构造一个动态LINQ to Entities ORDER BY子句

本文关键字:to LINQ Entities ORDER 子句 BY 动态 一个 何构造 | 更新日期: 2023-09-27 18:17:57

我知道如何构造WHERE子句,但由于某种原因,我无法构造order by子句。

IQueryable<ShowList> query = from s in db.ShowList select s;
if (title != null)
{
    query = query.Where(s => s.Title == title);
}

这就是不对的地方。我为用户提供了选择他们想要排序的列的选项,以及他/她是想要DESC还是ASC。我想我在OrderBy()里面做错了什么。

"orderBy"变量是来自用户的输入,"order"变量也是来自用户的输入。

"orderBy"应为列名,"order"应为"desc"或"asc"

if (orderBy != null && order != null)
            {
                switch (order)
                {
                    case "asc":
                        query = query.OrderBy(s => orderBy);
                        break;
                    case "desc":
                        query = query.OrderByDescending(s => orderBy);
                        break;
                    default:
                        query = query.OrderBy(s => orderBy);
                        break;
                }
            }
return query.ToList();
谁能告诉我我做错了什么?

如何构造一个动态LINQ to Entities ORDER BY子句

OrderBy方法的参数给LINQ应该用来排序查询结果的键。所以基本上你目前正在做的是说,在orderBy中包含的所有实体字符串应该用作一个键。因此不执行真正的排序。

然而最有可能的是orderBy指定了应该用于排序的属性的名称。如果你不想/需要把它弄得太复杂,你可以使用另一个开关/案例:

Func<ShowList, Object> orderByFunc = null;
switch (orderBy)
{
    case "Property1":
        orderByFunc = sl => sl.Property1;
        break;
    case "Property2":
        orderByFunc = sl => sl.Property2;
        break;
    // so on
    default:
        orderByFunc = sl => sl.Property1;
        break;
}

然后,当实际应用排序时:

case "asc":
    query = query.OrderBy(orderByFunc).AsQueryable();
    break;
case "desc":
    query = query.OrderByDescending(orderByFunc).AsQueryable();
    break;

您使用.OrderBy.OrderByDescending不正确。其中使用的lambda表达式应该为每一项生成一个值。相反,您将为每个项目生成相同的值(无论orderBy中是什么)。你需要做这样的事情:

Func<ItemType, object> orderByExpression;
switch (orderBy)
{
    case "Column1":
        orderByExpression = s => s.Column1;
        break;
    case "Column2":
        orderByExpression = s => s.Column2;
        break;
    ...
    default:
        throw new NotSupportedException();
}
switch (order)
{
    case "asc":
        query = query.OrderBy(orderByExpression);
        break;
    case "desc":
        query = query.OrderByDescending(orderByExpression);
        break;
    default:
        throw new NotSupportedException();
}