Bruno Laurinec
Bruno Laurinec

Reputation: 948

EF: LINQ - orderby using child collection with condition - ArgumentException

I'm running into troubles trying to sort IQueryable of my EF Entity.

My object structure is something like this:

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

and I'm working with

IQueryable<Item>

I'd need to sort it conditionally with values having desired definition id being sorted first something like this:

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

This however throws ArgumentException "DbSortClause expressions must have a type that is order comparable.".

I indeed understand what's the exception trying to say to me, I just can't figure out on how to change this so that valid query is generated.

Any help greatly appreciated

EDIT:

To bring some more light into the issue, I want to achieve something similar that this query does

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

Alternatively, as time is starting to become a factor for me, is there a way I could append OrderBy in string form?

Upvotes: 0

Views: 596

Answers (2)

Bruno Laurinec
Bruno Laurinec

Reputation: 948

Modification of Joanvo's answer did the trick, this is the working code [I've removed the inner OrderBy]

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

Upvotes: 0

Joanvo
Joanvo

Reputation: 5817

You probably want to use FirstOrDefault() at the end of the end of the first OrderBy so you won't be dealing with enumerables but with values.

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

Upvotes: 1

Related Questions