我需要为看起来像这样的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)"} , ....}
我需要按特定语言排序。
答案 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并将订单字段指定为字符串。