EF:LINQ - 使用带条件的子集合的orderby - ArgumentException

时间:2014-05-27 13:41:51

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

我遇到麻烦,试图对我的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?

2 个答案:

答案 0 :(得分:1)

您可能希望在第一个FirstOrDefault()结束时使用OrderBy,因此您不会使用值来处理枚举。

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

答案 1 :(得分:0)

修改Joanvo的答案就行了,这就是工作代码[我删除了内部的OrderBy]

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