如何在orderby子句中使用动态变量

时间:2013-01-15 07:01:53

标签: asp.net-mvc-3 linq entity-framework c#-4.0

我是linq的新手..我遇到了一个场景。即,

我必须根据用户输入对搜索结果进行排序。

用户输入是姓氏,名字和标题。对于输入3下拉是有的,我必须根据所选的值对结果进行排序。

我试过

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));

但它不起作用。

我想要这样的qry

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])..?

提前致谢。

3 个答案:

答案 0 :(得分:4)

我解决了我的情况如下 //用于排序的列列表

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

//将列字符串映射到属性

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

            };

//用户输入的订单

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]);

全心全意,

答案 1 :(得分:1)

实际上,您正在寻找动态linq查询,而不是尝试Dynamic LINQ (Part 1: Using the LINQ Dynamic Query Library)

允许这样做

enter image description here

这意味着您可以动态传递字符串属性名,以便在orderby函数中缩短您的集合

您还可以阅读:Dynamic query with Linq

答案 2 :(得分:0)

您可以手动编写表达式(任何Expression),然后将其附加到查询的上一部分。您可以在“Sorting in IQueryable using string as column name”中找到更多信息。