Dynamic Linq”;OrderBy”;运行时值

本文关键字:运行时 OrderBy Dynamic Linq | 更新日期: 2023-09-27 18:19:36

我今天一直在看Dynamic Linq(通过NuGet安装到VS中)。。。但到目前为止,我发现的所有示例都假设OrderBy是在已知的属性或列名上执行的;然而,我正在尝试OrderBy一个不是强类型的字段;但实际上是从Dictionary派生的行对象的键值;例如

class RowValues : Dictionary<string, string>
{
...
}

因此,要排序的列表是RowValues对象的列表,其中填充了Name、Value对。对于给定的RowValues列表,OrderBy字段可以通过命名值对条目的任何键(fyi:我希望最终在xml配置文件中指定OrderBy字段,这样就可以在不重新部署二进制文件等的情况下更改排序)。

我有一种预感,解决方案在于编写一个传递给OrderBy??的自定义排序函数???这个函数显然知道如何从RowValues对象中获得一个特定的值,该对象给定了xml配置中的字段名。。。。??到目前为止,我看到的答案显示,将一个包含自定义OrderBy子句的字符串传递到OrderBy中,这接近我想要的位置,但在我的情况下,运行时如何知道在哪里可以找到OrderBy字符串中引用的字段??

我们将非常感谢您的输入,或者我是否完全误解了Dynamic Linq函数?

Dynamic Linq”;OrderBy”;运行时值

如果您使用的是动态LINQ,它只会是:

var sortColumn = GetConfigValue(...);
var sorted = RowValues.OrderBy(sortColumn);

当然,您可以使用连接字符串来创建多重排序("column1, column2 DESC")。据我所知,除非使用常规LINQ,否则没有自定义排序函数。

此外,我会确保你知道动态LINQ的性能特点。


编辑:

这就是你要找的吗?这将根据字典中"Key"条目的值对其进行排序。如果您需要多个sort-by-s,您可以使用.ThenBy() 在循环中使用它

void Main()
{
    List<RowValues> v = new List<RowValues>();
    var key = "Key"; //GetFromConfig();
    var v1 = new RowValues();
    v1.Add("Key", "1");
    v1.Add("3", "5");
    var v2 = new RowValues();
    v2.Add("Key", "3");
    v2.Add("2", "2");
    var v3 = new RowValues();
    v3.Add("Key", "2");
    v3.Add("2", "2");
    v.Add(v1);
    v.Add(v2);
    v.Add(v3);
    v.OrderBy(r => r[key]).Dump();
}
class RowValues : Dictionary<string, string>
{
}

Kyle,再次感谢。很抱歉回复晚了,我现在已经离开了这个问题,但出于兴趣和礼貌,我想回来并同意你的代码离我想要的要近得多,但我们已经失去了动态linq方面。因此,在您调用OrderBy并对键进行排序的情况下,我想传递一个包含order命令的字符串,例如"r[key]desc"。原因是我想把订购方向的决定权留给运行时。我怀疑这可能通过使用表达式树来实现?例如:此处