linq to entity跳过concat

时间:2018-03-30 16:19:30

标签: c# entity-framework linq

我希望显示的结果不是先显示辅助ID,然后显示具有辅助ID的项目。但接下来我需要SkipTake

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 IQueryableSkip不再按技术顺序排列,因此Take_/_/_/_ 会抛出错误。像这样:

PagedList error: The method 'OrderBy' must be called before the method 'Skip'

2 个答案:

答案 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();