1

我知道如何构造 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();

谁能告诉我我做错了什么?

4

2 回答 2

4

方法的参数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;
于 2013-06-10T17:28:33.873 回答
1

您正在使用.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();
}
于 2013-06-10T17:27:36.780 回答