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函数?
如果您使用的是动态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"。原因是我想把订购方向的决定权留给运行时。我怀疑这可能通过使用表达式树来实现?例如:此处