C# IQueryable .Union 重置排序

huangapple go评论105阅读模式
英文:

C# IQueryable .Union reset sorting

问题

但是在 .Union 操作之后,排序被重置了。
如何防止排序被重置?

英文:

I have the following code:

  1. var expressions = new List<IQueryable<Container>>();
  2. var containers1 = containers
  3. .Where(x => EF.Functions.Like(x.ContainerReference1, $"%{message.SearchValue}%")
  4. || EF.Functions.Like(x.ContainerReference2, $"%{message.SearchValue}%"))
  5. .OrderBy(x => x.ContainerReference1)
  6. .ThenBy(x => x.ContainerReference2)
  7. .ThenByDescending(x => x.DateUpdated);
  8. expressions.Add(containers1);
  9. var containers2 = containers
  10. .Where(x => EF.Functions.Like(x.Description, $"%{message.SearchValue}%"))
  11. .OrderBy(x => x.Description)
  12. .ThenByDescending(x => x.DateUpdated);
  13. expressions.Add(containers2);
  14. var containers3 = containers.Where(x => x.ContactEmails
  15. .OrderBy(y => y.Email)
  16. .ThenBy(y => y.DisplayName)
  17. .Any(y => EF.Functions.Like(y.Email, $"%{message.SearchValue}%")
  18. || EF.Functions.Like(y.DisplayName, $"%{message.SearchValue}%")))
  19. .OrderByDescending(x => x.DateUpdated);
  20. expressions.Add(containers3);
  21. var containers4 = containers
  22. .Where(x => EF.Functions.Like(x.Keywords, $"%{message.SearchValue}%"))
  23. .OrderBy(x => x.Keywords)
  24. .ThenByDescending(x => x.DateUpdated);
  25. expressions.Add(containers4);
  26. containers = expressions.Aggregate((acc, i) => acc.Union(i));

But after .Union operation sorting is reset.
How can I prevent resetting of sorting?

答案1

得分: 1

Union 操作符不会保留元素的顺序。您需要根据数据的存在动态构建排序逻辑。

  1. var expressions = new List<IQueryable<Container>>();
  2. var sortingExpressions = new List<Func<IQueryable<Container>, IOrderedQueryable<Container>>>();
  3. var containers1 = containers
  4. .Where(x => EF.Functions.Like(x.ContainerReference1, $"%{message.SearchValue}%")
  5. || EF.Functions.Like(x.ContainerReference2, $"%{message.SearchValue}%"));
  6. if (containers1.Any())
  7. {
  8. var containers1Sorting = new Func<IQueryable<Container>, IOrderedQueryable<Container>>(x => x
  9. .OrderBy(y => y.ContainerReference1)
  10. .ThenBy(y => y.ContainerReference2)
  11. .ThenByDescending(y => y.DateUpdated));
  12. expressions.Add(containers1);
  13. sortingExpressions.Add(containers1Sorting);
  14. }
  15. var containers2 = containers
  16. .Where(x => EF.Functions.Like(x.Description, $"%{message.SearchValue}%"));
  17. if (containers2.Any())
  18. {
  19. var containers2Sorting = new Func<IQueryable<Container>, IOrderedQueryable<Container>>(x => x
  20. .OrderBy(y => y.Description)
  21. .ThenByDescending(y => y.DateUpdated));
  22. expressions.Add(containers2);
  23. sortingExpressions.Add(containers2Sorting);
  24. }
  25. var containers3 = containers
  26. .Where(x => x.ContactEmails
  27. .Any(y => EF.Functions.Like(y.Email, $"%{message.SearchValue}%")
  28. || EF.Functions.Like(y.DisplayName, $"%{message.SearchValue}%")));
  29. if (containers3.Any())
  30. {
  31. var containers3Sorting = new Func<IQueryable<Container>, IOrderedQueryable<Container>>(x => x
  32. .OrderBy(y => y.ContactEmails.OrderBy(z => z.Email).ThenBy(z => z.DisplayName))
  33. .OrderByDescending(x => x.DateUpdated));
  34. expressions.Add(containers3);
  35. sortingExpressions.Add(containers3Sorting);
  36. }
  37. var containers4 = containers
  38. .Where(x => EF.Functions.Like(x.Keywords, $"%{message.SearchValue}%"));
  39. if (containers4.Any())
  40. {
  41. var containers4Sorting = new Func<IQueryable<Container>, IOrderedQueryable<Container>>(x => x
  42. .OrderBy(y => y.Keywords)
  43. .ThenByDescending(y => y.DateUpdated));
  44. expressions.Add(containers4);
  45. sortingExpressions.Add(containers4Sorting);
  46. }
  47. var mergedContainers = expressions.Aggregate((acc, i) => acc.Union(i));
  48. if (sortingExpressions.Any())
  49. {
  50. var mergedSorting = sortingExpressions
  51. .Aggregate((acc, next) => q => next(acc(q)));
  52. containers = mergedSorting(mergedContainers);
  53. }
  54. else
  55. {
  56. containers = mergedContainers.OrderByDescending(x => x.DateUpdated);
  57. }
英文:

Union operator does not preserve the order of the elements. You need to dynamically construct the sorting logic based on the presence of data

  1. var expressions = new List&lt;IQueryable&lt;Container&gt;&gt;();
  2. var sortingExpressions = new List&lt;Func&lt;IQueryable&lt;Container&gt;, IOrderedQueryable&lt;Container&gt;&gt;&gt;();
  3. var containers1 = containers
  4. .Where(x =&gt; EF.Functions.Like(x.ContainerReference1, $&quot;%{message.SearchValue}%&quot;)
  5. || EF.Functions.Like(x.ContainerReference2, $&quot;%{message.SearchValue}%&quot;));
  6. if (containers1.Any())
  7. {
  8. var containers1Sorting = new Func&lt;IQueryable&lt;Container&gt;, IOrderedQueryable&lt;Container&gt;&gt;(x =&gt; x
  9. .OrderBy(y =&gt; y.ContainerReference1)
  10. .ThenBy(y =&gt; y.ContainerReference2)
  11. .ThenByDescending(y =&gt; y.DateUpdated));
  12. expressions.Add(containers1);
  13. sortingExpressions.Add(containers1Sorting);
  14. }
  15. var containers2 = containers
  16. .Where(x =&gt; EF.Functions.Like(x.Description, $&quot;%{message.SearchValue}%&quot;));
  17. if (containers2.Any())
  18. {
  19. var containers2Sorting = new Func&lt;IQueryable&lt;Container&gt;, IOrderedQueryable&lt;Container&gt;&gt;(x =&gt; x
  20. .OrderBy(y =&gt; y.Description)
  21. .ThenByDescending(y =&gt; y.DateUpdated));
  22. expressions.Add(containers2);
  23. sortingExpressions.Add(containers2Sorting);
  24. }
  25. var containers3 = containers
  26. .Where(x =&gt; x.ContactEmails
  27. .Any(y =&gt; EF.Functions.Like(y.Email, $&quot;%{message.SearchValue}%&quot;)
  28. || EF.Functions.Like(y.DisplayName, $&quot;%{message.SearchValue}%&quot;)));
  29. if (containers3.Any())
  30. {
  31. var containers3Sorting = new Func&lt;IQueryable&lt;Container&gt;, IOrderedQueryable&lt;Container&gt;&gt;(x =&gt; x
  32. .OrderBy(y =&gt; y.ContactEmails.OrderBy(z =&gt; z.Email).ThenBy(z =&gt; z.DisplayName))
  33. .OrderByDescending(x =&gt; x.DateUpdated));
  34. expressions.Add(containers3);
  35. sortingExpressions.Add(containers3Sorting);
  36. }
  37. var containers4 = containers
  38. .Where(x =&gt; EF.Functions.Like(x.Keywords, $&quot;%{message.SearchValue}%&quot;));
  39. if (containers4.Any())
  40. {
  41. var containers4Sorting = new Func&lt;IQueryable&lt;Container&gt;, IOrderedQueryable&lt;Container&gt;&gt;(x =&gt; x
  42. .OrderBy(y =&gt; y.Keywords)
  43. .ThenByDescending(y =&gt; y.DateUpdated));
  44. expressions.Add(containers4);
  45. sortingExpressions.Add(containers4Sorting);
  46. }
  47. var mergedContainers = expressions.Aggregate((acc, i) =&gt; acc.Union(i));
  48. if (sortingExpressions.Any())
  49. {
  50. var mergedSorting = sortingExpressions
  51. .Aggregate((acc, next) =&gt; q =&gt; next(acc(q)));
  52. containers = mergedSorting(mergedContainers);
  53. }
  54. else
  55. {
  56. containers = mergedContainers.OrderByDescending(x =&gt; x.DateUpdated);
  57. }

huangapple
  • 本文由 发表于 2023年6月1日 19:40:19
  • 转载请务必保留本文链接:https://go.coder-hub.com/76381485.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定