【问题标题】:dynamic linq query - OrderBy with properties that are null动态 linq 查询 - 属性为空的 OrderBy
【发布时间】:2013-05-07 07:05:53
【问题描述】:

我正在使用这里的 Ordering-By-String 扩展: http://blog.cincura.net/229310-sorting-in-iqueryable-using-string-as-column-name/

在我的数据源中,某些对象可能为空,因此不具有 EHR 的属性(见屏幕截图)。

我怎样才能捕捉到这种情况?我仍然希望空值包含在有序列表中,但只是在底部或顶部。

有什么建议吗?

编辑:进一步澄清..

所以我的 KendoUI 网格正在向服务器发送一个请求以按特定列排序。选择排序的列是“Month10.EHR”。 Month10 是一个子对象,而 EHR 是属性。一些子对象不存在,因此没有属性,子对象将为空。在执行排序时,它注意到一条记录不存在Month10,因此无法将其包含在orderby中。

我希望这是有道理的。

迈克

【问题讨论】:

  • 调用扩展的代码将比排序助手中的代码更有用,以查看您要执行的操作。

标签: c# linq


【解决方案1】:

使用Where 删除具有空顺序键的元素,然后使用Concat 重新添加它们。

例如

IEnumerable List<Person> myList;
// ...
var orderedList = myList
    .Where(p => p.Age != null)
    .OrderBy(p => p.Age)
    .Concat(myList.Where(p => p.Age == null));

再次阅读您的问题,看来您的意思是要排序的实际元素为空。在这种情况下,将它们包括在列表中的意义何在?

【讨论】:

  • 我认为这接近我需要的,除了我使用带有反射的属性名的字符串而不是固定类型(即年龄)来订购。不太清楚如何让它动态工作
  • 您是否尝试过使用所有元素都存在 Month10.EHR 的集合?
【解决方案2】:

在 OrderBy 函数中测试 null

IEnumerable<SomeType> myList;
// ...
var orderedList = myList.OrderBy(obj =>
                    obj == null 
                    || obj.Month10 == null 
                  ? defaultValue : obj.Month10.EHR);

【讨论】:

  • 我已经进一步澄清了我的问题。我正在尝试对子对象的属性进行排序,并且子对象可能不存在。我正在使用动态 linq 和反射来传递列名,所以这不是我想要做的
  • Month10.EHR 并不是他们可以点击的唯一列。有 12 列。 IE。 Month1.EHR、Month2.EHR 等。我想我必须全部检查一下?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
  • 2017-09-05
  • 1970-01-01
相关资源
最近更新 更多