【问题标题】:linq to entities skip after concat连接后跳过实体的 linq
【发布时间】:2018-03-30 16:19:29
【问题描述】:

我想先显示没有显示辅助 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 之后,IQueryable 在技术上不再是有序的,所以SkipTake 会抛出一个错误。像这样:

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

【问题讨论】:

  • 你有什么问题?为什么不能在最后一个 Select() 之后简单地添加一个或多个 OrderBy() 调用?
  • 另外,(t.second_id == null || t.second_id.Trim() == string.Empty) 可能只是 string.IsNullOrWhiteSpace(t.second_id)
  • @CamiloTerevinto 我认为这不适用于实体框架
  • @SamIam 它可以翻译IsNullOrWhiteSpace,就像它可以翻译Trim...
  • @CamiloTerevinto Samlam 是对的。它不起作用。我试过了。

标签: c# entity-framework linq


【解决方案1】:

您可以使用条件运算符在一个查询中完成:

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 我折叠了否定运算符,因为我认为它读起来更清楚。

【讨论】:

    【解决方案2】:

    你可以用一个查询来完成这项工作

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

    【讨论】:

    • 如果second_id 有多个不同长度的纯空格字符串,或者有空字符串和空字符串,我认为你的第一个ThenBy 会有问题。
    • @NetMage 我已经用不同的字符串测试了它,包括 null 和 empty,它可以工作。毕竟,OrderBy 只是遵循 IComparable 实现中描述的模式,我相信字符串实现涵盖了所有情况。
    • 尝试使用second_id = " " 和second_id = nullsecond_id = " "(两个空格)进行测试,您会发现它们不是按first_id 排序的在那种情况下,但他们应该是。
    • @NetMage 是的,你是对的。 Null 和 string.Empty 不相等,它将 null 放在 string.Empty 上方。所以看起来他们没有排序。我只测试了空值或只测试了 string.Empty。我认为字符串比较器将它们视为平等。
    • 在一般情况下它仍然可以工作,因为数据库中不太可能有空字符串作为键。总的来说,我会避免使用字符串键。
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2013-10-21
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-21
    • 2015-04-12
    • 1970-01-01
    相关资源
    最近更新 更多