有以下变量,存储了一个 IQueryable
:
var mainQuery = session
.Query<Employee>()
.Select(e => new
{
e.Name,
e.Address
});
同时,需要一个以IQueryable作为参数的方法。
public DataTable GetData(IQueryable query)
{
...
}
我该如何在GetData()
内部编写代码,以在Select()
之前添加OrderBy()
?
query
的最终值应该看起来像是使用以下Linq表达式构建的:
var query = session
.Query<Employee>()
.OrderBy(e => e.Age)
.Select(e => new
{
e.Name,
e.Address
});
这是必需的,因为如果我在
Select()
之后添加OrderBy()
,那么我只能按匿名类型(名称、地址)的成员进行排序。如果一个雇员还有年龄,那么当我把OrderBy()
放在Select()
之后时,我无法按年龄排序。更新:
GetData
对查询的结构一无所知,除了它以Select
结束。
而且它必须具有确切的签名public DataTable GetData(IQueryable query)
-没有额外的参数。需要修改方法内部的现有查询,并在
Select
之前添加OrderBy
。当有正确答案时,我会接受并投票支持。
GetData
内的查询修改为合同 - 添加OrderBy
必须在那里完成。如果你所回答的可以实现,那就不会有任何问题了。 - Răzvan Flavius PandaGetData
负责对数据进行排序是否有意义。如果在上述情况中,将select
放在GetData
之外是有效的,则在那里进行排序也是有意义的。GetData
应只负责获取数据。排序仅是表示问题,应与您的select
一起处理。如果您有多个调用者调用GetData
,则每个调用方期望按不同方式对数据进行排序可能是有意义的。这就是为什么排序是表示问题,并应该由上一级处理。 - Jordan ParmerGetData()
只是我随意选的一个名称,它是由ObjectDataSource
使用的方法,因此需要在其中进行分页/排序。如果我在投影之后使用OrderBy
,则无法按Employee
的任何字段进行排序,例如Age
在Select
之后不可用于排序。重建表达式树正是我所寻找的,我不知道IQueryable
是不可变的。对于增加的价值+1,您说了如何做,但是在非常高的层面上 :) - Răzvan Flavius Panda