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

时间:2012-05-16 18:54:23

标签: c# .net linq lambda

我需要为看起来像这样的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)"} , ....}

我需要按特定语言排序。

2 个答案:

答案 0 :(得分:1)

您的查询似乎正在执行此操作:

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

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

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

编辑:根据明确的要求,我建议您先执行所有where子句(无需对您忽略的数据进行排序),然后应用所有.OrderBy()。如果你可以让他们成为lambdas,这比你建议的链接(双关语)更容易:

.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>,这就是为什么你不能(没有强制转换)重用相同的var。

答案 1 :(得分:0)

您只需按OrderBy应用第一个订单字段,然后按ThenBy应用所有其他字段。在cource中,你必须使用IOrderedEnumerable类型的temporarry变量。

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

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