C# 如何将任意(可能是复合)排序序列附加到IQueryable

C# 如何将任意(可能是复合)排序序列附加到IQueryable,c#,linq,C#,Linq,我希望将一个或多个排序子句(通过动态linq使用表达式而不是字符串声明)的任意序列附加到IQueryable。如何做到这一点 问题的关键在于: private IOrderedQueryable<TProject> Demo<TSource, TProject>( IQueryable<TSource> query, Expression<Func<TSource, TProject>> project, Exp

我希望将一个或多个排序子句(通过动态linq使用表达式而不是字符串声明)的任意序列附加到IQueryable。如何做到这一点

问题的关键在于:

private IOrderedQueryable<TProject> Demo<TSource, TProject>(
    IQueryable<TSource> query,
    Expression<Func<TSource, TProject>> project,
    Expression<Func<IQueryable<TProject>, IOrderedQueryable<TProject>>> order
) {
    var projection = query.Select(project);
    //??? How to combine project and order as an expression tree
    var orderedProjection = order.Compile()(projection);
    //??? rather than a compiled delegate (as shown here)
    return orderedProjection;
}
private IOrderedQueryable演示(
可查询的查询,
表达工程,
表达顺序
) {
var projection=query.Select(项目);
//?如何将项目和订单组合为表达式树
var orderedProjection=order.Compile()(投影);
//??而不是编译委托(如图所示)
返回顺序投影;
}

还有一些上下文(正如khellang所指出的,没有编译):

私有类ProjectOrder{
公共表达式投影{get;set;}
公共表达式排序{get;set;}
}
私有类部分过滤器{
公共字符串文本{get;set;}
公共字符串[]零件号{get;set;}
public int[]PartTypes{get;set;}
//....
}
私有IOrderedQueryable获取(ProjectOrder ProjectOrder,PartFilters){
var baseQuery=\u db.Part\u Parts;
//基于过滤器将where谓词追加到baseQuery
var projection=baseQuery.Select(projectOrder.projection);
//??如何将投影和订购结合起来
var orderedProjection=projectOrder.Ordering.Compile()(投影);
//??表达式树而不是编译委托
返回顺序投影;
}
私有void TestFetch(PartFilters){
表达式投影=\=>newpartdescription(){
零件号=\ u0.PartNumber,
Description=\说明
};
//任意排序表达式、多个子句可以使用基类或联接实体
//通过导航属性
表达顺序=
q=>q.OrderBy(\u=>\ u0.PartNumber.Length)。然后是by(\u=>\ u0.PartNumber);
var projectOrder=newprojectorder(){
投影=投影,
订购=订购
};
获取(项目订单、过滤器);
}

第三个参数完全没有理由是表达式。它可以只是一个普通的委托

这里的要点是执行
order
实际上并不是执行排序。执行
order
操作的是查询的表达式。您不需要表示如何操作
表达式
对象的
表达式。你可以这么做

private IOrderedQueryable<TProject> Demo<TSource, TProject>(
    IQueryable<TSource> query,
    Expression<Func<TSource, TProject>> projection,
    Func<IQueryable<TProject>, IOrderedQueryable<TProject>> order) 
{
    return order(query.Select(projection));
}
private IOrderedQueryable演示(
可查询的查询,
表达式投影,
Func命令)
{
退货订单(查询、选择(投影));
}

瞧,您有一个方法,可以根据投影和排序构建查询。

很难理解您在这里要实现的目标。这只是一堆奇怪的代码(不是编译)和一个非常模糊的问题…很难理解您在这里要做什么。你能描述一下你想要的结果是什么吗?可能包括一些代码或伪代码来演示调用者将如何使用你的代码?问题是你想传递一个用于形成orderby的表达式吗?确切地说。我想传递一个表示排序序列的预定义表达式。例如,OrderBy(=>Field1)。然后by(=>BaseClassField2)。然后ByDescending(>NavProp1.NavProp2.Field)并将其应用于iQueryTable。@Servy Best me to it(向上投票)iQueryTables是可组合的,这意味着即使您使用EntityFramework查询数据库,查询也将被解析为具有order by的查询。完美!我有概念上的误解,认为这种方法是使用委托来操纵内存中的物化IQueryable。
private IOrderedQueryable<TProject> Demo<TSource, TProject>(
    IQueryable<TSource> query,
    Expression<Func<TSource, TProject>> projection,
    Func<IQueryable<TProject>, IOrderedQueryable<TProject>> order) 
{
    return order(query.Select(projection));
}