如何有条件地使用lambda和非lambda linq?

时间:2013-07-24 22:34:14

标签: c# sql linq lambda

在下面的代码中:

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'这样的关键字吗?如果是这样,怎么样?

非常感谢任何帮助! 谢谢!

1 个答案:

答案 0 :(得分:2)

由于您需要使用service.IsDefault == null保持元素的顺序,因此一个简单的解决方案是将数据集拆分为两部分(第一个service.IsDefault == null,第二个:服务.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
              };