【问题标题】:EF: LINQ - orderby using child collection with condition - ArgumentExceptionEF:LINQ - orderby 使用带有条件的子集合 - ArgumentException
【发布时间】:2014-05-28 05:33:07
【问题描述】:

我在尝试对我的 EF 实体的 IQueryable 进行排序时遇到了麻烦。

我的对象结构是这样的:

Item
Item.CustomFieldValue [List<CustomFieldValue>]
Item.CustomFieldValue.DefinitionID
Item.CustomFieldValue.Value

我正在合作

IQueryable<Item>

我需要有条件地对其进行排序,首先对具有所需定义 id 的值进行排序,如下所示:

queryable = queryable
    .OrderBy(p => p.CustomFieldValue
        .Where(p2 => p2.DefinitionID == defId)
        .Select(p3 => p3.Value)
        .OrderBy(p4 => p4)
    );

但是,这会引发 ArgumentException“DbSortClause 表达式必须具有可排序的类型。”。

我确实理解试图对我说的异常是什么,我只是不知道如何更改它以便生成有效的查询。

非常感谢任何帮助

编辑:

为了让问题更清晰,我想实现与此查询类似的功能

SELECT * FROM ticketnumber t, customfieldvalue c 
WHERE t.id like '%00000047%' and c.ticketnumberid = t.id
ORDER BY CASE
    WHEN DefinitionId = 2125 THEN 1
    ELSE 2
END, c.Value ASC

或者,随着时间开始成为我的一个因素,有没有办法可以以字符串形式附加 OrderBy?

【问题讨论】:

  • 您能举例说明您的确切排序要求吗?您想对您的Item 集合或项目中的值进行排序吗?我认为您想根据某些 Item.CustomFieldValue 对您的 Item 集合进行排序,但是哪些值和哪些值在前?
  • 我有可查询的项目,该项目包含 CustomFieldValue 的集合。假设我们有 5 个项目,每个项目在 CustomFieldValue 集合中都有 5 个字段 [defId 为 1,2,3,4,5]。我需要让它按 CustomFieldValue 中具有指定 DefinitionId 的字段进行排序。所以例如我需要通过 CustomFieldValue.Value 订购项目,其中 defId=3 ....希望我让事情变得更明亮

标签: c# linq entity-framework linq-to-entities


【解决方案1】:

您可能希望在第一个 OrderBy 的末尾使用 FirstOrDefault(),这样您就不会处理可枚举值而是值。

queryable = queryable
    .OrderBy(p => p.CustomFieldValue
        .Where(p2 => p2.DefinitionID == defId)
        .Select(p3 => p3.Value)
        .OrderBy(p4 => p4)
        .FirstOrDefault()
    );

【讨论】:

    【解决方案2】:

    修改 Joanvo 的答案成功了,这是工作代码 [我已经删除了内部 OrderBy]

    queryable = queryable.OrderBy(p => p.CustomFieldValue.Where(p2 => p2.DefinitionID == defId).Select(p3 => p3.Value).FirstOrDefault());
    

    【讨论】:

      猜你喜欢
      • 2021-08-26
      • 1970-01-01
      • 1970-01-01
      • 2018-01-14
      • 2018-04-01
      • 1970-01-01
      • 2016-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多