3

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

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

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

更新:

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

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

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

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

我需要按特定语言排序。

4

2 回答 2

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();

在这些东西周围撒上一些条件,你就会变成金色的。请注意, query 是 typeIQueriable<T>并且 orderedQuery 是 type IOrderedQueriable<T>,这就是为什么你不能(没有强制转换)重用相同的 var。

于 2012-05-16T19:00:20.010 回答
0

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

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

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

于 2012-05-16T19:44:21.270 回答