C# 多个Linq函数作为参数

C# 多个Linq函数作为参数,c#,.net,linq,C#,.net,Linq,我有一个在数据库中搜索项目的方法。因为我多次使用它,所以我将其设置为通用: public async Task Search(Expression<Func<T, bool>> criteria, Func<T, object> order) { return Task.Run(async () => Searchlist.AddRange((await Service.SearchAsync(criteria, false)).AsEnumer

我有一个在数据库中搜索项目的方法。因为我多次使用它,所以我将其设置为通用:

public async Task Search(Expression<Func<T, bool>> criteria, Func<T, object> order)
{
    return Task.Run(async () => Searchlist.AddRange((await Service.SearchAsync(criteria, false)).AsEnumerable().OrderBy(order)));
}
但我有一些对象是按多个(2到4)属性排序的。因此,它们的顺序如下:

await Search(GetCriteria(), p => p.Description);
SearchAsync(criteria, false)).AsEnumerable().OrderBy(x => x.Date).ThenBy(y => y.Nr).ThenBy(z => z.Type))
我可以创建一个参数,在这里我可以调用这些方法。例如
.OrderBy(x=>x.Date).然后by(y=>y.Nr).然后by(z=>z.Type)
或仅
.OrderBy(x=>x.Date)


谢谢

如果您能够中断当前的函数界面,请使用:

public async Task Search(Expression<Func<T, bool>> criteria, Func<T, object>[] order)
{
    var elems = await Service.SearchAsync(criteria, false);
    var sorted = elems.AsEnumerable().OrderBy(order.First());
    foreach(var subOrder in order.Skip(1)){
      sorted = sorted.ThenBy(subOrder);
    }
    Searchlist.AddRange(sorted)
}

await Search(GetCriteria(), new []{p => p.Date, p => p.Description});
public async Task Search(
   Expression<Func<T, bool>> criteria, 
   Func<T, object> mainOrder, 
   params Func<T, object>[] subOrders)
{
    var elems = await Service.SearchAsync(criteria, false);
    var sorted = elems.AsEnumerable().OrderBy(mainOrder);
    foreach(var subOrder in subOrders){
      sorted = sorted.ThenBy(subOrder);
    }
    Searchlist.AddRange(sorted)
}

await Search(GetCriteria(), p => p.Date, p => p.Description);
公共异步任务搜索(表达式条件,Func[]顺序)
{
var elems=await Service.SearchAsync(条件,false);
var sorted=elems.AsEnumerable().OrderBy(order.First());
foreach(顺序中的变量子顺序。跳过(1)){
排序=排序。然后按(子排序);
}
Searchlist.AddRange(已排序)
}
等待搜索(GetCriteria(),new[]{p=>p.Date,p=>p.Description});
如果不想破坏当前界面,请使用:

public async Task Search(Expression<Func<T, bool>> criteria, Func<T, object>[] order)
{
    var elems = await Service.SearchAsync(criteria, false);
    var sorted = elems.AsEnumerable().OrderBy(order.First());
    foreach(var subOrder in order.Skip(1)){
      sorted = sorted.ThenBy(subOrder);
    }
    Searchlist.AddRange(sorted)
}

await Search(GetCriteria(), new []{p => p.Date, p => p.Description});
public async Task Search(
   Expression<Func<T, bool>> criteria, 
   Func<T, object> mainOrder, 
   params Func<T, object>[] subOrders)
{
    var elems = await Service.SearchAsync(criteria, false);
    var sorted = elems.AsEnumerable().OrderBy(mainOrder);
    foreach(var subOrder in subOrders){
      sorted = sorted.ThenBy(subOrder);
    }
    Searchlist.AddRange(sorted)
}

await Search(GetCriteria(), p => p.Date, p => p.Description);
公共异步任务搜索(
表达标准,
Func mainOrder,
参数Func[]子订单)
{
var elems=await Service.SearchAsync(条件,false);
var sorted=elems.AsEnumerable().OrderBy(mainOrder);
foreach(子订单中的变量子订单){
排序=排序。然后按(子排序);
}
Searchlist.AddRange(已排序)
}
等待搜索(GetCriteria(),p=>p.Date,p=>p.Description);

不要等待任务。在搜索方法中运行
wait Task.Run(async()
调用方可以确定是要等待它,还是可能要等待多个任务。只需返回任务即可。