Martin
Martin

Reputation: 240

MVC, Linq - Sorting issue

I get this error:

DbSortClause expressions must have a type that is order comparable. Parameter name: key | at System.Data.Common.CommandTrees.ExpressionBuilder.Internal.ArgumentValidation.ValidateSortClause(DbExpression key) at System.Data.Common.CommandTrees.ExpressionBuilder.DbExpressionBuilder.ToSortClause(DbExpression key) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OrderByTranslatorBase.TranslateOneLambda(ExpressionConverter parent, DbExpressionBinding sourceBinding, DbExpression lambda) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, DbExpression& source, DbExpressionBinding& sourceBinding, DbExpression& lambda) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.OneLambdaTranslator.Translate(ExpressionConverter parent, MethodCallExpression call) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.SequenceMethodTranslator.Translate(ExpressionConverter parent, MethodCallExpression call, SequenceMethod sequenceMethod) at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.TypedTranslate(ExpressionConverter parent, MethodCallExpression linq) at System.Data.Objects.ELinq.ExpressionConverter.TypedTranslator1.Translate(ExpressionConverter parent, Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.TranslateExpression(Expression linq) at System.Data.Objects.ELinq.ExpressionConverter.Convert() at System.Data.Objects.ELinq.ELinqQueryState.GetExecutionPlan(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption) at System.Data.Objects.ObjectQuery1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() at System.Data.Entity.Internal.Linq.InternalQuery1.GetEnumerator() at System.Data.Entity.Infrastructure.DbQuery1.System.Collections.Generic.IEnumerable<TResult>.GetEnumerator() at System.Collections.Generic.List1..ctor(IEnumerable1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable1 source) at MvcMusicStore.Controllers.StoreManagerController.Index(String sortOrder) in

When trying this code

var albums = db.Albums.Include(a => a.Genre).Include(a => a.Artist);

            switch (sortOrder) {
                case "Artist desc":
                    albums = albums.OrderByDescending(o => o.Artist);
                    break;
                case "Title desc":
                    albums = albums.OrderByDescending(o => o.Title);
                    break;
                case "Title":
                    albums = albums.OrderBy(o => o.Title);
                    break;
                case "Genre desc":
                    albums = albums.OrderByDescending(o => o.Genre);
                    break;
                case "Genre":
                    albums = albums.OrderBy(o => o.Genre);
                    break;
                default:
                    albums = albums.OrderBy(o => o.Artist);
                    break;
            }

            return View(albums.ToList());

I cannot find a way to sort it.

Upvotes: 1

Views: 2861

Answers (1)

Yuck
Yuck

Reputation: 50825

You're saying .Include(a => a.Artist); as well as .OrderByDescending(o => o.Artist);. If you're trying to sort by an object Artist that would account for your error. You probably want something like this instead:

albums = albums.OrderByDescending(o => o.Artist.Name);

I'm assuming that an Artist has a String property Name, but maybe it's called something different. The same would go for Genre:

albums = albums.OrderByDescending(o => o.Genre.Name);

In general, you need to sort by primitive values and not on entire objects.

Upvotes: 4

Related Questions