Anish Karunakaran
Anish Karunakaran

Reputation: 987

how to use a dynamic variable in orderby clause

am a newbie in linq.. am stuck with one scenario. ie,

i have to sort the search results based on user input.

user inputs are Last Name, First Name and Title. for input 3 drop downs are there and i have to sort result based on the values selected.

i tried

order = Request["orders"].Split(',');

                var param = order[0];
                var p1 = typeof(Test).GetProperty(param);
                param = order[1];
                var p2 = typeof(Test).GetProperty(param);
                param = order[2];
                var p3 = typeof(Test).GetProperty(param);


model.Test = (from tests in  model.Test
                   select tests).
            OrderBy(x => p1.GetValue(x, null)).
            ThenBy(x => p2.GetValue(x, null)).
            ThenBy(x => p3.GetValue(x, null));

but it doesn't works.

i want qry like this

from tests in  model.Test
select tests).OrderBy(x => x.lastname).
ThenBy(x => x.firstname).ThenBy(x => x.Title);

order[0]== lastname but how can i use it in the place of OrderBy(x => x.order[0])..?

Thanks in advance.

Upvotes: 3

Views: 2881

Answers (3)

Anish Karunakaran
Anish Karunakaran

Reputation: 987

i solved my case as follows // list of columns to be used for sorting

 List<string>order = Request["orders"].Split(',').ToList();

//map the column string to property

var mapp = new Dictionary<string, Func<Test, string>>
            {
                {"FirstName", x => x.FirstName},
                {"LastName", x => x.LastName},
                {"SimpleTitle", x => x.SimpleTitle}

            };

//user inputted order

var paras = new List<Func<Test, string>>();
            foreach (var para in order)
            {
                if(!string.IsNullOrEmpty(para))
                paras.Add(mapp[para]);
            }

//sorting
            model.Test= model.Test.OrderBy(paras[0]).ThenBy(paras[1]).ThenBy(paras[2]);

Thanks all,

Upvotes: 4

cincura.net
cincura.net

Reputation: 4150

You can compose the expression (any Expression) manually from pieces and then append it to the previous part of query. You can find more info, with example in "Sorting in IQueryable using string as column name".

Upvotes: 0

Pranay Rana
Pranay Rana

Reputation: 176896

Actually you are looking for dynamic linq query than you can try out Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

which allow to do like this

enter image description here

it means you can dynamically pass string propertyname to short you collection in orderby function

You can also read about : Dynamic query with Linq

Upvotes: 1

Related Questions