我知道如何构造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();
任何人都可以告诉我我做错了什么吗?
答案 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();
}