需要帮助才能使用表达式树生成 LINQ 查询
本文关键字:LINQ 查询 表达式 帮助 | 更新日期: 2023-09-27 18:34:28
我需要为 LINQ 查询构建一个如下所示的压缩树:
collection.OrderBy(e => ((MyObject)e["PropertyIndex"]).dictionary.Where(k => k.Key == "keyName").Select(k => k.Value).Single());
我查看了这个链接,它解释了如何链接 OrderBy 方法。 我不知道如何使用表达式树在订单中添加位置。
更新:
我需要动态对内存中的数据进行排序。因此,linq 查询可能如下所示:
collection.OrederBy(field1).ThenByDescending(field2).ThenBy(field3)
我只知道在运行时需要按多少字段进行排序。字段 X 中的任何一个都可以是复杂对象。 当然,对象的类型将在运行时知道。 其中一个对象具有结构,如上面的 LINQ 查询所示。 它有一个字典,我必须对特定的键进行排序。 就我而言,字典包含本地化数据,例如:
{{"en-US", "word (en)"}, {"es-ES", "word (es)"} , ....}
我需要按特定语言排序。
您的查询似乎正在这样做:
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((。 如果你可以让它们成为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>
的类型,这就是为什么你不能(不强制转换(重用相同的变量。
您只需要按 OrderBy 应用一阶字段,通过 ThenBy 应用所有其他字段。当然,您必须使用类型为 IOrderedEnumerable 的临时变量。
如果您需要添加一些过滤器,则必须在任何订单之前添加 where。
如果有许多可能的订单选项,并且您不想对它们进行硬编码,则可以使用动态 LinQ 并将订单字段指定为字符串。