【问题标题】:OrderBy multiple properties in Razor and Umbraco 4.11.8在 Razor 和 Umbraco 4.11.8 中 OrderBy 多个属性
【发布时间】:2013-08-07 13:41:18
【问题描述】:

在使用 Umbraco 更新我们的网站期间,我们从 4.7.2 升级到了 4.11.8。

在一个 CSHTML 文件中我有这个代码:

foreach(var item in Model.AncestorOrSelf("Master")
                         .Items.First()
                         .PublicationFolder.First()
                         .Children.Where("Visible")
                         .OrderBy("publicationType, date desc"))

它工作正常,首先按 publicationType 对集合进行排序,然后按最新的 date 对集合进行排序。

在新版本 (4.11.8) 中不再起作用。它给了我一个例外:At least one object must implement IComparable.

如果我写.OrderBy("publicationType", "date desc"),它不会影响收藏。

这是一个错误还是我做错了什么? 有解决办法吗?

【问题讨论】:

  • 您找到解决方案了吗?
  • 是的,我找到了解决方案。我会为此写一个答案。

标签: linq razor sql-order-by umbraco multiple-columns


【解决方案1】:

我找到了一个解决方案,因此我需要将集合转换为 List<DynamicNode> 以便它工作。

foreach (var item in ((List<DynamicNode>)@Model.AncestorOrSelf("Master")
    .Items.First()
    .PublicationFolder.First()
    .Children.Where("Visible").Items)
    .OrderBy(t => t.GetPropertyValue("publicationType"))
    .ThenByDescending(t => t.GetPropertyValue("date")))

【讨论】:

  • Brian,实际上这与我的答案几乎完全相同。我们正在投射相同的东西,唯一的区别是您正在执行隐式投射,而我正在使用 Cast() 方法进行投射。
【解决方案2】:

Where("Visible") 扩展返回 IQueryable&lt;DynamicNode&gt;,因此您应该能够为此查询应用 LINQ OrderBy()OrderByDescending() 语法。不过,您可能需要更改某些位:

foreach(var item in Model.AncestorOrSelf("Master")
                     .Items.First()
                     .PublicationFolder.First()
                     .Children.Where("Visible")
                     .Cast<DynamicNode> // This line is optional
                     .OrderBy(x => x.GetPropertyValue("publicationType")
                     .ThenByDescending(x => x.GetPropertyValue("date"))

我添加了一个可选行来表明您可以将 dynamic 对象显式转换为 DynamicNode 对象,然后您可以在视图中使用智能感知。

【讨论】:

    【解决方案3】:

    如果没记错的话,你应该能够链接 OrderBys

    foreach(var item in Model.AncestorOrSelf("Master").Items.First().PublicationFolder.First().Children.Where("Visible").OrderBy("publicationType").OrderByDescending("date"))
    

    【讨论】:

    • 这可能是解决方案,但我收到此错误:'umbraco.MacroEngines.DynamicNodeList' 不包含'OrderByDescending' 的定义。有什么遗漏吗?
    • 链接排序似乎会用链的每个部分覆盖它,所以这有一个有限的用例并且不能解决原始问题。对我来说,下面的其他解决方案(使用.ThenByDescending)效果更好,因为我需要同时按几个不同的属性订购,这也是问题的症结所在。很高兴知道您可以像这样链接,所以感谢您的回答:)
    猜你喜欢
    • 1970-01-01
    • 2017-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 2012-03-18
    • 1970-01-01
    相关资源
    最近更新 更多