如何构建动态LINQ to Entities ORDER BY子句?

时间:2013-06-10 17:19:48

标签: c# asp.net-mvc linq-to-entities dynamic-programming asp.net-web-api

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

任何人都可以告诉我我做错了什么吗?

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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();
}