使用表达式树构建LINQ查询需要帮助

3

我需要为一个类似于下面这样的LINQ查询构建表达式树:

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)"} , ....}

我需要按特定语言进行排序。

1
你能解释一下你想要在数据方面实现什么吗?也许有更简单的解决方案 :) - Mathew Thompson
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();

在这些事情周围添加一些条件,你就会成功了。请注意,查询是类型为 IQueriable<T> 的,有序查询是类型为 IOrderedQueriable<T> 的,这就是为什么你不能(不进行强制转换)重用同一个变量的原因。

我需要动态地在内存中对数据进行排序。因此,Linq查询可能如下所示:collection.OrederBy(field1).ThenByDescending(field2).ThenBy(field3)我只知道在运行时需要按多少个字段进行排序。 - Vadim
这对我来说不是一个选项。我需要构建一个表达式树。我也解决了我的问题。我在'e'对象上创建了一个函数,我在表达式树中使用反射调用它。但还是谢谢你的回答。你绝对值得+1。我明天会把我的解决方案放在这里。 - Vadim

0

你只需要使用OrderBy对第一个字段进行排序,然后使用ThenBy对所有其他字段进行排序。当然,你必须使用类型为IOrderedEnumerable的临时变量。

如果你需要添加一些过滤器,则必须在任何排序之前添加Where。

如果有许多可能的排序选项,而你不想硬编码它们,那么你可以使用动态LinQ并将排序字段指定为字符串。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接