【发布时间】:2019-01-27 21:32:34
【问题描述】:
我正在从另一种方法 (QueryItems) 中检索已订购的 IQueryable<Item>。我想(有条件地)在传递IQueryable<Item> 之前颠倒它的顺序。
public async Task<PagedList<Item>> GetItems(FilterParameters filterParameters)
{
var items = QueryItems(filterParameters)
if (filterParams.Descending)
{
//do something to reverse the order of the IQueryable
}
return await PagedList<Item>
.CreateAsync(items, filterParams.PageNumber, filterParams.PageSize)
}
我不能这样做 var reversed = items.ToList().Reverse; items = reversed.AsQueryable() 因为那样它(显然)不能用于异步任务。
当我尝试执行 items = items.Reverse() 时,出现以下错误:
System.NotImplementedException: Remotion.Linq.Clauses.ResultOperators.ReverseResultOperator
主要是因为我很懒,我宁愿不使用QueryItems 方法来实现items.OrderByDescending(),因为这需要一堆if/else 语句。
那么...如何反转 IQueryable 的顺序?
编辑 - 包括 PagedList.CreateAsync(...)
public class PagedList<T> : List<T>
{
public int CurrentPage { get; set; }
public int TotalPages { get; set; }
public int PageSize { get; set; }
public int TotalCount { get; set; }
public PagedList(List<T> items, int count, int pageNumber, int pageSize)
{
TotalCount = count;
PageSize = pageSize;
CurrentPage = pageNumber;
TotalPages = (int) Math.Ceiling(count / (double) pageSize);
this.AddRange(items);
}
public static async Task<PagedList<T>> CreateAsync(IQueryable<T> source, int pageNumber, int pageSize)
{
var count = await source.CountAsync();
var items = await source.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToListAsync();
return new PagedList<T>(items, count, pageNumber, pageSize);
}
}
【问题讨论】:
-
您可以将外部
OrderByDescending附加到QueryItems返回的内容上,但从性能的角度来看这可能并不好,并且您需要全面了解QueryItems无论如何应用的排序级别。所以你需要一堆Ifs,在你最初应用排序的地方。 -
这基本上是关于实现集合和 IQueryable 之间的区别。
-
为什么不能使用 .OrderByDescending()
-
@Seabizkit 在我的
QueryItems方法中,我已经在订购列表了。如果我执行类似 `items = items.OrderByDescending(item => item.Id) 的操作,那么我在前一个方法中所做的排序将被覆盖。我真的只是想在它已经被订购后寻找一种简单的方法来翻转它。
标签: c# linq asp.net-core-2.1