我希望显示的结果不是先显示辅助ID,然后显示具有辅助ID的项目。但接下来我需要Skip
和Take
。
IQueryable<thing> result;
IQueryable<thing> result2;
result2 = result
.Where(t => !(t.second_id == null || t.second_id.Trim() == string.Empty))
.OrderBy(t => t.second_id);
result = result
.Where(t => (t.second_id== null || t.second_id.Trim() == string.Empty))
.OrderBy(t => t.first_id);
result = result.Concat(result2);
return result
.Select(t => t.primary_key)
.Skip(pageSize * pageNumber)
.Take(pageSize)
.ToList();
问题是Concat
IQueryable
后Skip
不再按技术顺序排列,因此Take
和_/_/_/_
会抛出错误。像这样:
PagedList error: The method 'OrderBy' must be called before the method 'Skip'
答案 0 :(得分:2)
您可以使用条件运算符在一个查询中执行此操作:
return result.OrderBy(t => (t.second_id != null && t.second_id.Trim() != String.Empty))
.ThenBy(t => (t.second_id != null && t.second_id.Trim() != String.Empty) ? t.second_id : t.first_id)
.Select(t => t.primary_key)
.Skip(pageSize * pageNumber)
.Take(pageSize)
.ToList();
如果您需要以某种方式订购重复的second_id
,则需要进行一些调整,但原始代码却没有。
PS我把它放在了否定算子中,因为我认为它更清楚。
答案 1 :(得分:0)
您可以使用单个查询完成工作
result = result
.OrderByDescending(t => (t.second_id== null || t.second_id.Trim() ==
string.Empty))
.ThenBy(t => t.second_id)
.ThenBy(t => t.first_id)
.Select(t => t.primary_key)
.Skip(pageSize * pageNumber)
.Take(pageSize)
.ToList();