【问题标题】:how to use a dynamic variable in orderby clause如何在 orderby 子句中使用动态变量
【发布时间】:2013-01-15 07:01:53
【问题描述】:

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

提前致谢。

【问题讨论】:

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


【解决方案1】:

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

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

谢谢大家,

【讨论】:

    【解决方案2】:

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

    允许这样做

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

    您还可以阅读:Dynamic query with Linq

    【讨论】:

    • 当我尝试字符串 a = order[0]; var reslt =(来自模型中的测试。TestFlatDatas 选择测试).OrderBy(a); OrderBy 将错误显示为“方法 IOrderedEnumerableSystem.Linq.OrderBy(this Ienenumerable,Func) 的类型争论”无法从用法中推断出来。尝试指定显式参数。
    • @AnishKarunakaran-您是否通过从 msdn 或从 scott gu 文章链接下载动态 linq 库来引用它。 .
    • 很抱歉我没有找到这样的.. 我添加了 Nuget system.Linq.Dynamic.. 但没有区别。能否请您指定下载链接。
    • @AnishKarunakaran - 这里是下载链接:msdn.microsoft.com/en-us/vstudio//bb894665.aspx
    • @AnishKarunakaran - 只需在您的项目中包含动态库 cs 文件即可...
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 2016-03-18
      • 1970-01-01
      • 2012-02-16
      • 1970-01-01
      • 2011-06-05
      相关资源
      最近更新 更多