基于EF Core与LINQ实现适配Kendo Grid的用户订单矩阵网格
实现方案
1. 预查询基础数据(减少数据库交互次数)
优先一次性拉取全量所需数据,避免循环触发数据库查询:
// 启用AsNoTracking提升查询性能 var allUsers = await _context.Users.AsNoTracking().ToListAsync(); var allCustomers = await _context.Customers.AsNoTracking().ToListAsync(); var allUserOrders = await _context.UserOrders.AsNoTracking().ToListAsync();
2. 定义矩阵绑定模型
适配Kendo Grid的绑定逻辑,用字典存储动态列对应的数值:
public class UserOrderMatrixRow { // 行固定字段:用户基础信息 public int UserId { get; set; } public string UserName { get; set; } // Key为客户ID,Value为对应位置的订单数值,无关联记录则为null public Dictionary<int, decimal?> CustomerOrderValues { get; set; } = new(); }
3. 用LINQ生成矩阵数据
先构造关联映射字典提升查找效率,再批量生成矩阵行:
// 构造用户+客户维度的订单数值映射字典,查找时间复杂度O(1) var orderMapping = allUserOrders.ToDictionary( keySelector: o => (o.UserId, o.CustomerId), elementSelector: o => o.OrderValue ); // 生成矩阵数据 var matrixResult = allUsers.Select(user => { var row = new UserOrderMatrixRow { UserId = user.Id, UserName = user.Name }; // 填充所有客户对应的订单数值 foreach (var customer in allCustomers) { row.CustomerOrderValues[customer.Id] = orderMapping.TryGetValue((user.Id, customer.Id), out var val) ? val : null; } return row; }).ToList();
4. Kendo Grid绑定适配
可根据全量客户列表动态生成Grid列,无需硬编码列配置:
// 后端MVC绑定示例(前端JS绑定逻辑同理,动态生成columns配置即可) @(Html.Kendo().Grid<UserOrderMatrixRow>() .Name("userOrderMatrix") .Columns(col => { col.Bound(r => r.UserName).Title("用户").Width(120); // 动态生成所有客户列 var customerList = ViewBag.AllCustomers as List<Customer>; foreach (var customer in customerList) { col.Bound(r => r.CustomerOrderValues[customer.Id]) .Title(customer.Name) .Width(100); } }) .DataSource(ds => ds.Ajax().Read(r => r.Action("LoadMatrixData", "YourControllerName"))) .Sortable() .Scrollable() )
性能优化建议
如果数据量超过10万条,建议:
- 加数据库索引覆盖
UserOrder表的UserId、CustomerId、OrderValue字段 - 采用分页查询代替全量拉取
- 前端开启Kendo Grid的虚拟滚动功能
内容的提问来源于stack exchange,提问作者Rohlik
相关产品推荐
相关产品推荐

