You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Core 2项目中DataTables的OrderBy报错:无法加载System.Data.Entity程序集,求解决

在ASP.NET Core 2中使用DataTables排序的解决方案

首先得明确:你不能直接使用依赖System.Data.Entity的OrderBy方法——因为ASP.NET Core 2基于.NET Core框架,它配套使用的是Entity Framework Core(EF Core),而System.Data.Entity是传统.NET Framework下老版本EF(EF6及更早)的专属程序集,这两个生态完全不兼容,所以才会抛出找不到程序集的异常。

下面给你几个可行的替代方案,都是适配ASP.NET Core 2 + EF Core环境的:

1. 用EF Core原生Linq排序

EF Core本身自带完整的Linq排序方法,完全能满足需求,只要你的查询对象是EF Core的DbSet<T>或者IQueryable<T>:

// 简单示例:按用户名升序排序
var sortedUsers = _context.Users.OrderBy(u => u.UserName).ToList();

如果是动态排序(比如根据DataTables前端传的列名动态选择排序字段),可以用反射+表达式树实现通用排序方法:

// 通用动态排序方法
private IQueryable<T> ApplyDynamicSort<T>(IQueryable<T> query, string sortColumn, bool isAscending)
{
    var propertyInfo = typeof(T).GetProperty(sortColumn);
    if (propertyInfo == null) return query;

    var parameter = Expression.Parameter(typeof(T), "entity");
    var propertyAccess = Expression.MakeMemberAccess(parameter, propertyInfo);
    var sortExpression = Expression.Lambda(propertyAccess, parameter);

    var sortMethodName = isAscending ? "OrderBy" : "OrderByDescending";
    var sortedQuery = Expression.Call(
        typeof(Queryable),
        sortMethodName,
        new[] { typeof(T), propertyInfo.PropertyType },
        query.Expression,
        Expression.Quote(sortExpression));

    return query.Provider.CreateQuery<T>(sortedQuery);
}

// 调用示例:按"CreateTime"降序排序
var sortedData = ApplyDynamicSort(_context.Orders, "CreateTime", false);

2. 使用DataTables官方的.NET Core适配库

DataTables有专门针对.NET Core的官方包DataTables.AspNet.Core,它能自动解析前端传递的排序、分页、过滤参数,不用手动写排序逻辑,非常省心:
第一步先安装NuGet包:

Install-Package DataTables.AspNet.Core

然后在Startup.cs中配置服务和中间件:

using DataTables.AspNet.Core;
using DataTables.AspNet.AspNetCore;

public void ConfigureServices(IServiceCollection services)
{
    // 注册DataTables服务
    services.AddDataTables();
    // 其他服务配置(比如AddMvc)...
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    // 启用DataTables中间件
    app.UseDataTables();
    // 其他中间件配置(比如UseMvc)...
}

之后在Controller里处理DataTables的请求:

using DataTables.AspNet.Core;

[HttpPost]
public IActionResult LoadData(IDataTablesRequest request)
{
    var baseQuery = _context.Products.AsQueryable();

    // 自动应用排序
    foreach (var sortColumn in request.Columns.Where(col => col.Sort != null))
    {
        baseQuery = sortColumn.Sort.Direction == SortDirection.Ascending
            ? baseQuery.OrderBy(sortColumn.Field)
            : baseQuery.OrderByDescending(sortColumn.Field);
    }

    // 处理分页和统计
    var totalRecords = baseQuery.Count();
    var filteredRecords = baseQuery.Count(); // 如果有过滤逻辑这里要调整
    var data = baseQuery.Skip(request.Start).Take(request.Length).ToList();

    // 返回符合DataTables格式的结果
    return new DataTablesJsonResult(data, request, totalRecords, filteredRecords);
}

3. 排查并替换老EF依赖代码

检查你的项目中是否引用了老EF的扩展方法(比如System.Data.Entity.DbExtensions里的方法),如果有,直接替换成EF Core对应的方法——EF Core的Linq API和老EF基本一致,但要确保引用的是Microsoft.EntityFrameworkCore命名空间下的扩展。

内容的提问来源于stack exchange,提问作者Malcolm McCaffery

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 09:04:19