【问题标题】:Dynamic Linq "OrderBy" on runtime values运行时值上的动态 Linq“OrderBy”
【发布时间】:2014-10-21 14:32:35
【问题描述】:

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

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

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

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

非常感谢您的输入,还是我完全误解了 Dynamic Linq 功能?

【问题讨论】:

    标签: c# .net linq dynamic


    【解决方案1】:

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

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

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

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


    编辑:

    这就是你要找的吗?这将根据字典中“键”条目的值对其进行排序。如果需要多个 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 :-) 但是我在解决方案中对您的代码的解释导致异常,因为运行时无法在与指定的排序列名称匹配的行上找到属性。这是因为行本身只是 Dictionary 派生对象。这让我回到了最初的问题,即将动态 linq 语法应用于键值对行,而不是映射到“列”的具体属性名称。我不认为我对这个问题的解释很好,我已经找到了一个解决方案,我会尽快写出来并发布。
    • @Toadfather 让我知道第二个代码是否是您正在寻找的。我也不认为你的解释很好;),但我认为我们可以解决根本问题。
    • @Toadfather 我不知道那是什么意思。
    • 请参阅下面的答案,尽管由于使用了“谢谢”这个词,它被一个模组(我假设)删除了一次。
    【解决方案2】:

    凯尔,再次感谢。很抱歉迟到的回复,我现在已经从这个问题上继续了,但出于兴趣和礼貌,我想回来并同意你的代码更接近我想要到达的地方,但我们已经失去了动态 linq 方面。因此,在您调用 OrderBy 并对键进行排序的地方,我想传递一个包含命令命令的字符串,例如“r[key] desc”。原因是我想将关于订购哪个方向的决定留到运行时。我怀疑这可能会使用表达式树来完成?例如:here

    【讨论】:

    • 请不要添加“谢谢”作为答案。一旦你有足够的reputation,你就可以vote up questions and answers你觉得有帮助。
    • 好的,事情就是这样。我想添加“谢谢”作为评论,但我不知道如何在评论中获取代码标记格式(因为我的回复包括一行我想很好地显示格式的代码),所以我创建了一个答案。我在帮助指南中看到这不是推荐的做法,很好,但是如何回复答案并包含代码格式?
    • RowValues.OrderBy(r[key] + " desc"); ?如果您唯一的问题是您想将订单保存到运行时,我会使用 if 语句并执行 OrderBy 或 OrderByDescending。它会更快,也更容易维护。
    • 另外,在回复某人的评论时,请确保包括@[用户名],例如@Toadfather。
    猜你喜欢
    • 2014-06-02
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-02
    • 1970-01-01
    相关资源
    最近更新 更多