【问题标题】:Need help to use Expression Tree to build a LINQ query需要帮助以使用表达式树构建 LINQ 查询
【发布时间】:2012-05-17 03:44:21
【问题描述】:

我需要为看起来像这样的 LINQ 查询构建一个 epression 树:

collection.OrderBy(e => ((MyObject)e["PropertyIndex"]).dictionary.Where(k => k.Key == "keyName").Select(k => k.Value).Single());

我查看了this link,它解释了如何链接 OrderBy 方法。我不知道如何使用表达式树在 OrderBy 中添加 Where。

更新:

我需要动态地对内存中的数据进行排序。所以 linq 查询可能看起来像这样:

collection.OrederBy(field1).ThenByDescending(field2).ThenBy(field3)

我只在运行时才知道需要按多少个字段进行排序。 任何 fieldX 都可以是复杂对象。对象的类型当然会在运行时知道。其中一个对象具有您在上面的 LINQ 查询中看到的结构。它有一本字典,我必须对特定的键进行排序。在我的情况下,字典包含本地化数据,例如:

{{"en-US", "word (en)"}, {"es-ES", "word (es)"} , ....}

我需要按特定语言排序。

【问题讨论】:

  • 您能准确解释一下您正在努力实现数据方面的目标吗?可能有一个更简单的解决方案:)

标签: c# .net linq lambda


【解决方案1】:

您的查询似乎正在这样做:

from k in collection
where k.Key == "keyName"
orderby ((MyObject)k)["PropertyIndex"]
select k.Value

你可以添加更多这样的 where 子句:

from k in collection
where k.Key == "keyName"
&& k.OtherProperty == OtherValue
orderby ((MyObject)k)["PropertyIndex"]
select k.Value

编辑:根据明确的要求,我建议您首先执行所有 where 子句(无需对您将忽略的数据进行排序),然后应用所有 .OrderBy()。如果您可以将它们设为 lambda,那比您建议的链接(双关语)要容易得多:

.OrderBy( e => e.Property1 ).OrderBy( e => e.Property2 )

如果您想“动态地”形成这些,请执行以下操作:

var query = (from k in collection select k);
query = query.Where( e => e.Property1 == "value" );
var orderedQuery = query.OrderBy( e => e.Property1 );
orderedQuery = query.Orderby( e => e.Property2 );
var result = orderedQuery.Select( e => e.Value ).Single();

在这些东西周围撒上一些条件,你就会很成功。请注意,查询的类型为IQueriable<T>,orderedQuery 的类型为IOrderedQueriable<T>,这就是为什么您不能(不进行强制转换)重用相同的变量。

【讨论】:

  • 我需要对内存中的数据进行动态排序。所以 linq 查询可能看起来像这样:collection.OrederBy(field1).ThenByDescending(field2).ThenBy(field3) 我只知道在运行时我需要按多少个字段进行排序。
  • 这不是我的选择。我需要构建一个表达式树。我也解决了我的问题。我在“e”对象上创建了一个函数,我在表达式树中使用反射调用该函数。但是谢谢你的回答。你绝对值得+1。明天我会把我的解决方案放在这里。
【解决方案2】:

您只需要通过 OrderBy 应用第一个订单字段,然后通过 ThenBy 应用所有其他字段。当然,您必须使用 IOrderedEnumerable 类型的临时变量。

如果您需要添加一些过滤器,那么您必须在任何订单之前添加 Where。

如果有许多可能的订单选项并且您不想硬编码它们,那么您可以使用 Dynamic LinQ 并将订单字段指定为字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多