【问题标题】:How to orderby conditionally using lambda and non lambda linq?如何有条件地使用 lambda 和非 lambda linq 进行排序?
【发布时间】:2013-07-24 22:34:14
【问题描述】:

在下面的代码中:

var results = from service 
              in LogisticsService.GetTransportationModes<CarrierTransportationMode>
              (
                  x => x.CarrierId == carrierRoleId && 
                       x.ParentTransportationModeId != null &&
                       !(x is LoadCarrierMode) &&
                       (x.ParentTransportationMode.TransportationModeStatus != null) &&
                       x.ParentTransportationMode.TransportationModeStatus.Value != TransportationModeStatus.Inactive
               )
                       //.OrderByDescending(o => o.IsDefault)
                       //.ThenBy(t => t.ParentTransportationMode.Name)
               orderby service.IsDefault descending, service.ParentTransportationMode.Name
               select new
               {
                   text = service.ParentTransportationMode.Name,
                   value = service.ParentTransportationMode.Id
               };

如果service.IsDefault 为空,我需要完全跳过 orderby / thenby。因此,代码将执行,就好像 linq 中没有 orderby 一样,如下所示:

var results = from service 
              in LogisticsService.GetTransportationModes<CarrierTransportationMode>
              (
                  x => x.CarrierId == carrierRoleId &&
                       x.ParentTransportationModeId != null &&
                       !(x is LoadCarrierMode) &&
                       (x.ParentTransportationMode.TransportationModeStatus != null) &&
                       x.ParentTransportationMode.TransportationModeStatus.Value != TransportationModeStatus.Inactive
              )
              select new
              {
                  text = service.ParentTransportationMode.Name,
                  value = service.ParentTransportationMode.Id
              };

我尝试使用如下条件修改查询:

.OrderByDescending(o => o.IsDefault.HasValue ? o.IsDefault : null)
.ThenBy(t => t.IsDefault.HasValue ? t.ParentTransportationMode.Name : null)
orderby !service.IsDefault.HasValue ? null: service.IsDefault descending, service.ParentTransportationMode.Name

但这并没有帮助。

我是否需要在 orderby 中传递任何特殊参数,以便完全不会有条件地进行排序?可以使用任何像“case”这样的关键字吗?如果有,怎么做?

不胜感激! 谢谢!。

【问题讨论】:

  • 你想让service.IsDefault == null的所有元素都在service.IsDefault == null的所有元素之前还是之后?
  • 好吧,如果 service.IsDefault == null,我希望所有元素的顺序与从数据库中获取的顺序相同。只有当任何元素都有 service.IsDefault == true 时,我们才应该考虑排序,而不是其他情况。

标签: c# sql linq lambda


【解决方案1】:

由于您需要使用service.IsDefault == null 保持元素的顺序,一个简单的解决方案是将您的数据集分成两部分(第一部分为service.IsDefault == null,第二部分:service.IsDefault != null)对第二部分进行排序,然后,concat :

var transportationModes = LogisticsService.GetTransportationModes<CarrierTransportationMode>(x =>
                              x.CarrierId == carrierRoleId &&
                              x.ParentTransportationModeId != null &&
                              !(x is LoadCarrierMode) &&
                              (x.ParentTransportationMode.TransportationModeStatus != null) &&
                              x.ParentTransportationMode.TransportationModeStatus.Value != TransportationModeStatus.Inactive)

var services = (from service in transportationModes
                where service.IsDefault == null
                select service).Concat
               (from service in transportationModes
                where service.IsDefault != null
                orderby service.IsDefault descending, service.ParentTransportationMode.Name
                select service);

var results = from service in services
              select new
              {
                  text = service.ParentTransportationMode.Name,
                  value = service.ParentTransportationMode.Id
              };

【讨论】:

  • 这是一个伟大的灵魂。非常感谢 Cédric Bignon!。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-29
  • 2010-10-17
  • 1970-01-01
  • 2011-04-15
  • 2019-11-26
  • 2023-04-04
相关资源
最近更新 更多