views:

146

answers:

3

Hi,

I have created a function that has the follwing parameter:

List<Expression<Func<CatalogProduct, bool>>> orderBy = null

This parameter is optional, If it is filled it should create a order by and than by constuction for me, so that I can order the result on the SQL server.

I tried:

            IOrderedQueryable temp = null;
            foreach (Expression<Func<CatalogProduct, bool>> func in orderBy)
            {
                if (temp == null)
                {
                    temp = catalogProducts.OrderBy(func);
                }
                else
                {
                    temp = temp.ThanBy(func);
                }
            }

But the than By is not reconized. Does someone know how I can solve this problem?


I changed it to .ThenBy() but this is only allowed directly after the .OrderBy() and not on a IOrderedQueryable

so temp = catalogProducts.OrderBy(func).ThenBy(func); is allowed but temp = catalogProducts.OrderBy(func); temp = temp.ThenBy(func); issn't

Any other suggestions?

+5  A: 

Two problems; firstly, ThanBy should be ThenBy; secondly, ThenBy is only available on the generic type, IOrderedQueryable<T>.

So change to:

        IOrderedQueryable<CatalogProduct> temp = null;
        foreach (Expression<Func<CatalogProduct, bool>> func in orderBy) {
            if (temp == null) {
                temp = catalogProducts.OrderBy(func);
            } else {
                temp = temp.ThenBy(func);
            }
        }

and you should be sorted.

Marc Gravell
+1 for the pun...
ck
A: 

try this

   IOrderedQueryable temp = null; 
   foreach (Expression<Func<CatalogProduct, bool>> func in orderBy) 
    { 
      if (temp == null) 
        { 
          temp = catalogProducts.OrderBy(func);
        } 
        else
        { 
          temp = temp.OrderBy(func); 
        } 
     }
smash
That will reorder *from scratch* each time. For multiple orderings, you really ought to use `ThenBy`.
Jon Skeet
Calling a second `OrderBy` will, depending on the implementation, either do the sorts in the reverse order, *or* only sort by the last one.
Marc Gravell
@Jon - not *quite* necessarily; remember that LINQ sort is meant to be stable, so this just reverses the sort sequence.
Marc Gravell
@Marc: True. It's basically not the right way to go though :)
Jon Skeet
A: 
        foreach (Expression<Func<CatalogProduct, bool>> func in orderBy)
        {
            catalogProducts = catalogProducts.OrderBy(func);
        }

This will be OK.

Kthurein