c# - 多个 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)).AsEnumerable().OrderBy(order)));
}

因为它是通用的,所以我实现了参数顺序,它们是正确排序的。我这样调用方法:

await Search(GetCriteria(), p => p.Description);

但我有一些对象是按多个(2 到 4 个)属性排序的。所以它们是这样排列的:

SearchAsync(criteria, false)).AsEnumerable().OrderBy(x => x.Date).ThenBy(y => y.Nr).ThenBy(z => z.Type))

我可以创建一个参数来放置要调用的方法吗?像 .OrderBy(x => x.Date).ThenBy(y => y.Nr).ThenBy(z => z.Type) 或只有 .OrderBy(x => x .日期)

谢谢

最佳答案

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

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);

关于c# - 多个 Linq 函数作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57821655/

相关文章:

c# - 为什么 PDFTron PDFViewCtrl.Update() 抛出 AccessViolationException

c# - 在 c# .net 中验证 Firebase JWT

c# - IEnumerable<T> 是隐含的顺序相关性还是应该是明确的?

c# - 如何使用 .NET LLRP 库 : Org. LLRP.LTK.LLRPV1.LLRPXmlParser.ParseXMLToLLRPMessage

c# - `lock`(监视器)在 .NET 中如何工作?

c# - 即使一组为空,获取笛卡尔积的 LINQ 查询是什么?

c# - 从通用 List<t> 中删除项目

c# - .net Winforms 中的保存图像问题

c# - 使用反射创建通用 IList 实例

c# - 如何为拾音器添加声音?