在LINQ中,是否可以使用条件orderby排序顺序(升序与降序).
像这样的东西(不是有效的代码):
bool flag;
(from w in widgets
 where w.Name.Contains("xyz")
 orderby w.Id (flag ? ascending : descending)
 select w)
Ric*_*ard 30
如果以增量方式构建表达式,则可以执行此操作.通常更容易使用表达式而不是理解表达式:
var x = widgets.Where(w => w.Name.Contains("xyz"));
if (flag) {
  x = x.OrderBy(w => w.property);
} else {
  x = x.OrderByDescending(w => w.property);
}
(假设Widget property是排序的基础,因为你没有列出一个.)
Car*_*lin 17
......或者在一个陈述中全部完成
bool flag;
var result = from w in widgets where w.Name.Contains("xyz")
  orderby
    flag ? w.Id : 0,
    flag ? 0 : w.Id descending
  select w;
您可以定义没有排序的基本查询,然后根据标志排序:
var query=(from w in widgets
  where w.Name.Contains("xyz")
  select w);
var result = flag ?
  query.OrderBy(w =>w) :
  query.OrderByDescending(w = w);
您可以尝试以下内容:
var q = from i in list
         where i.Name = "name"
         select i;
if(foo)
     q = q.OrderBy(o=>o.Name);
else
     q = q.OrderByDescending(o=>o.Name);
这是一个更通用的解决方案,可用于各种条件lambda表达式,而不会破坏表达式的流程。
public static IEnumerable<T> IfThenElse<T>(
    this IEnumerable<T> elements,
    Func<bool> condition,
    Func<IEnumerable<T>, IEnumerable<T>> thenPath,
    Func<IEnumerable<T>, IEnumerable<T>> elsePath)
{
    return condition()
        ? thenPath(elements)
        : elsePath(elements);
}
例如
var result = widgets
    .Where(w => w.Name.Contains("xyz"))
    .IfThenElse(
        () => flag,
        e => e.OrderBy(w => w.Id),
        e => e.OrderByDescending(w => w.Id));
| 归档时间: | 
 | 
| 查看次数: | 34864 次 | 
| 最近记录: |