entity-framework - 执行 Entity Framework 集合排序所需的通用函数

标签 entity-framework linq func

我有一个带有列的网格。选择网格列标题后,我将 post/ajax 发送到服务器,并选择标题以返回 x 行。

在下面的代码中,RefNo 是一个整数,而 ProposalSectionNumber 是一个字符串。

如何制作一个接受字符串但返回 Func 的通用函数以在 linq 语句中使用?

if (sort.dir == SortDirection.Asc)
{
    switch (sort.field)
    {
        case "RefNo":
            qry = qry.OrderBy(x => x.RefNo);
            break;
        case "ProposalSectionNumber":
            qry = qry.OrderBy(x => x.ProposalSectionNumber);
            break;                     
    }
}
else
{
    switch (sort.field)
    {
        case "RefNo":
            qry = qry.OrderByDescending(x => x.RefNo);
            break;
        case "ProposalSectionNumber":
            qry = qry.OrderByDescending(x => x.ProposalSectionNumber);
            break;

    }
}

我想做类似的事情 字符串 sortOrder = "RefNo" var sortfunc = SortFunc(sortOrder)

if (sort.dir == SortDirection.Asc)
{
   qry = qry.OrderBy(sortFunc)
}
else
{
   qry = qry.OrderByDesc(sortFunc)
}

我一直在努力创建函数 SortFunc(基于字符串或整数返回)

实现此目标的最佳方法是什么?

最佳答案

sortFunc 声明类型的问题是它取决于您排序的字段类型。如果所有字段都是同一类型,比如说,所有 string s,你可以使用 Expression<Func<MyEntity,string>> 的类型为你的 sortFunc变量。

当排序字段不共享公共(public)类型时,还有另一种消除代码重复的方法。引入一个将排序顺序作为参数的通用辅助方法,并调用它而不是 OrderBy/OrderByDescending :

private static IOrderedQueryable<T> AddOrderBy<T,TKey>(
    IQueryable<T> orig
,   Expression<Func<T,TKey>> selector
,   bool isAscending
) {
    return isAscending ? orig.OrderBy(selector) : orig.OrderByDescending(selector);
}

现在您可以按如下方式重写代码:

var isAscending = (sort.dir == SortDirection.Asc);
switch (sort.field) {
    case "RefNo":
        qry = qry.AddOrderBy(x => x.RefNo, isAscending);
        break;
    case "ProposalSectionNumber":
        qry = qry.AddOrderBy(x => x.ProposalSectionNumber, isAscending);
        break;                     
}

关于entity-framework - 执行 Entity Framework 集合排序所需的通用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47418960/

相关文章:

c# - 将依赖项注入(inject) Entity Framework 实体和项目

c# - 如何在 LINQ 中通过索引连接两个集合

c# - Func Invoke,有没有更好的解决办法

c# - Entity Framework Code First - 更改表名

c# - ASP.NET : EF 5. X - 访问级别错误

c# - LINQ to SQL 加入 FirstOrDefault() 问题

c# - 使用 LINQ 按索引连接

C#:具有继承类型构造函数的 Func

c# - 通过 Func<> 传递参数

c# - Code first DbMigrator 在从不同机器构建时导致错误