C# 表达式OrderBy Then By return(Func<;IQueryable<;tenty>;,IOrderedQueryable<;tenty>;)

C# 表达式OrderBy Then By return(Func<;IQueryable<;tenty>;,IOrderedQueryable<;tenty>;),c#,linq,expression-trees,C#,Linq,Expression Trees,我有一个存储库类,如下所示。这里我的问题是GetSelected方法 公共类存储库:i存储,其中tenty:class { 受保护的只读DbContext数据库; 受保护的只读数据库集; 公共存储库(DbContext上下文) { Db=上下文; DbSet=Db.Set(); } //积垢作业 public IEnumerable GetSelected(表达式筛选器=null,Func orderBy=null,参数表达式[]includeProperties) { IQueryable q

我有一个存储库类,如下所示。这里我的问题是GetSelected方法

公共类存储库:i存储,其中tenty:class
{
受保护的只读DbContext数据库;
受保护的只读数据库集;
公共存储库(DbContext上下文)
{
Db=上下文;
DbSet=Db.Set();
}
//积垢作业
public IEnumerable GetSelected(表达式筛选器=null,Func orderBy=null,参数表达式[]includeProperties)
{
IQueryable query=DbSet;
if(过滤器!=null)
{
query=query.Where(过滤器);
}
foreach(includeProperty中的var includeProperty)
{
query=query.Include(includeProperty);
}
if(orderBy!=null)
{
returnorderby(query.ToList();
}
其他的
{
返回query.ToList();
}
}
}
我试图通过动态提供以下参数对部门进行分类

[路由(“api/[控制器]”)]
[ApiController]
公共类部门控制器:LookupBaseController
{
私有只读IUowLookups UowLookups;
公共部门控制员(IUowLookups uowLookups):基础(uowLookups)
{
UowLookups=UowLookups;
}
[HttpPost]//在这个问题上即兴发挥
[路线(“getorderd”)]
公共IEnumerable GetSelectedValues(列表ID)
{
var sortColumns=new Dictionary();
sortColumns.Add(“代码”,新分拣机(1,SortDirection.Ascending));
sortColumns.Add(“名称”,新分拣机(2,SortDirection.升序));
IQueryable coll=Enumerable.Empty().AsQueryable();
var sortExp2=ExpressionBuilder.OrderByColumns(coll、sortColumns);
var data=UowLookups.Repository().GetSelected(null,sortExp2)
返回data.ToList();
}
}
我有下面的代码(在StackOverflow中找到)运行良好。但是我希望下面的代码返回(
Func
)而不是集合。我也不希望将集合传递给这个方法,相反,它应该将
tenty
I pass作为集合。这可行吗

公共静态IQueryable OrderByColumns(此IQueryable集合,IDictionary sortedColumns)
{
//基本上,sortedColumns包含用户想要排序的列,以及
//排序方向。
//对于我的屏幕截图,分类列看起来像
// [
//{“盒式磁带”{Order=1,Direction=SortDirection.Ascending},
//{“slotNumber”,{Order=2,Direction=SortDirection.Ascending}
// ]
bool firstTime=true;
//表示表中每一行的类型
var itemType=类型(tenty);
//将传入类型为TModel的lamda“x”的参数命名
var参数=表达式参数(itemType,“x”);
//循环遍历已排序的列以构建表达式树
foreach(sortedColumns.OrderBy中的var sortedColumn(sc=>sc.Value.Order))
{
//根据键从TModel获取属性
var prop=Expression.Property(参数,sortedColumn.Key);
//构建x=>x.CASEX或x=>x.SlotNumber之类的东西
var exp=表达式Lambda(属性,参数);
//根据排序方向,得到正确的方法
string方法=string.Empty;
如果(第一次)
{
方法=sortedColumn.Value.Direction==SortDirection.Ascending
?“订购人”
:“OrderByDescending”;
第一次=错误;
}
其他的
{
方法=sortedColumn.Value.Direction==SortDirection.Ascending
“然后”
:“然后下降”;
}
//itemType是TModel的类型
//exp.Body.Type是属性的类型。同样,对于CASE,它是
//一个字符串。对于SlotNumber,它是双精度的。
类型[]类型=新类型[]{itemType,exp.Body.Type};
//构建调用表达式
//它将看起来像:
//OrderBy*(x=>x.CASE)或Order*(x=>x.SlotNumber)
//然后按*(x=>x.CASEX)或按*(x=>x.SlotNumber)
var mce=Expression.Call(typeof(Queryable)、方法、类型、,
集合。表达式,exp);
//现在可以对集合运行表达式
collection=collection.Provider.CreateQuery(mce);
}
回收;
}
答案很简单:

public static Func CreateOrderByFunc(IDictionary sorted列)
{
返回q=>(IOrderedQueryable)q.OrderByColumns(sortedColumns);
}

这是一个非常奇怪的请求,感觉像是XY问题。你到底想实现什么?我有一个存储库类,它有一个接受参数Func orderBy的GetData方法。我想将上述函数(集合)的结果作为参数orderBy.Post用法示例的参数值传递给该方法(GetData)。语言是不够的。你好,丹尼利夫,谢谢你帮助我的努力。我有一个Repository类,它的方法是below@Jacob,只需编辑原始问题并添加用法示例。为什么要使用这些存储库使应用程序复杂化?对我来说,这只是浪费时间和使调试复杂化。谢谢Danyliv。它成功了。我浪费了将近三天的时间来让这东西工作。我可以知道一些我可以理解表达式树、LINQ等细节的好资源吗?再次非常感谢。关于存储库模式,有人告诉我们,这是最好的方法。甚至一些微软网站也在推荐这一点。@Jacob:我在这里回复你,而不是通过电子邮件。一开始我不知道你想要什么。您提到的关于创建表达式树dyna的我的解决方案