LINQ多表连接后如何通过System.Linq.Dynamic.Core实现动态排序?
解决Dynamic Linq动态排序不生效的问题
我来帮你理清楚问题出在哪,以及怎么快速解决:
首先,你的第二种写法思路是对的,但犯了一个Linq的常见误区:Linq的方法都是返回新的查询对象,不会修改原集合本身。所以你调用OrderBy和ThenBy之后,必须把返回值重新赋值给sortedResults,否则原集合根本不会应用排序规则。
修正你的现有代码
把这段无效的代码:
sortedResults.OrderBy("PatternName").ThenBy("Model");
改成:
sortedResults = sortedResults.OrderBy("PatternName").ThenBy("Model");
这样就能正确触发动态排序了。
另外补充下:你的第一种写法用了查询语法的orderby,但普通Linq的查询语法不支持直接传入字符串作为排序条件——Dynamic Linq的动态排序能力是通过扩展方法实现的,所以只能用方法链的方式调用OrderBy/ThenBy这类扩展方法,没法在查询语法里直接写字符串参数。
用方法语法实现多表连接+动态排序
其实查询语法和方法语法都能配合Dynamic Linq使用,不是必须换方法语法,但如果想写方法语法的多表连接,这里给你一个完整的示例:
// 方法语法实现多表内连接 var baseQuery = dataContext.Requirements .Join(dataContext.Patterns, reqs => reqs.PatternRequirement, pats => pats.Id, (reqs, pats) => new { reqs, pats }) .Join(dataContext.Suppliers, combined => combined.reqs.SupplierRequirement, sups => sups.Id, (combined, sups) => new { combined.reqs.Id, sups.SupplierName, combined.pats.PatternName, combined.reqs.Model, combined.reqs.YardageRequirements, combined.reqs.Repeat, combined.reqs.ModelDescription, combined.reqs.CreateUser, combined.reqs.CreateTimeStamp, combined.reqs.UpdateUser, combined.reqs.UpdateTimeStamp }); // 应用动态排序(支持带排序方向的字符串,比如"PatternName desc, Model") string sortExpression = "PatternName, Model"; // 这里可以替换成用户输入的动态变量 var sortedResults = baseQuery.OrderBy(sortExpression); return sortedResults;
额外小技巧
如果你的排序规则是用户输入的完整表达式(比如包含降序的"PatternName desc, Model"),可以直接把整个字符串传给OrderBy,不需要分开调用ThenBy,Dynamic Linq会自动解析这个复合排序规则。
内容的提问来源于stack exchange,提问作者Tanksley
相关产品推荐
相关产品推荐

