ASP.NET Core 2项目中DataTables的OrderBy报错:无法加载System.Data.Entity程序集,求解决
首先得明确:你不能直接使用依赖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

