动态Linq" OrderBy"关于运行时值

时间:2014-08-27 20:55:39

标签: c# .net linq dynamic

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

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

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

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

非常感谢输入,还是我完全误解了动态Linq功能?

2 个答案:

答案 0 :(得分:0)

如果您使用的是动态LINQ,那就是:

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

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

另外,我会确保您了解Dynamic LINQ的性能特征。


编辑:

这是你要找的吗?这将根据字典中“Key”条目的值对其进行排序。如果您需要按-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>
{

}

答案 1 :(得分:-1)

凯尔,再次感谢。对于迟到的回复道歉,我现在已经从这个问题转移了但出于兴趣和礼貌我想回来并同意你的代码更接近我想要的地方,但我们已经失去了动态的linq方面。因此,在您调用OrderBy并对密钥进行排序的地方,我希望传递一个包含命令命令的字符串,例如&#34; r [key] desc&#34;。原因是我想要确定直到运行时的顺序。我怀疑这可能会使用表达式树完成吗?例如:here