如何修复“类型中不存在属性或字段”错误?

Pha*_*tom 3 c# linq asp.net-mvc entity-framework dynamic-linq

我在尝试对 Order 表中没有的任何列进行排序时遇到此错误,如果我使用OrderBy("Customer.CompanyName" + " " + sortDir)该错误将消失但所有列都将无法排序。下面OrderBy使用的方法来自这里

问题的原因是什么?

    public ActionResult WebGrid(int page = 1, int rowsPerPage = 10, string sortCol = "OrderID", string sortDir = "ASC")
    {
        List<Order> res;
        using (var nwd = new NorthwindEntities())
        {
             var _res = nwd.Orders
                .OrderBy(sortCol + " " + sortDir)
                .Select(o => new Order
                {
                    OrderID = o.OrderID,
                    OrderDate = o.OrderDate,
                    CompanyName = o.Customer.CompanyName,
                    FirstName = o.Employee.FirstName,
                    //......
                    //......
                    //......
                });
Run Code Online (Sandbox Code Playgroud)

Zei*_*kki 6

您提供链接的类被标记为internal,并且不能在定义它的程序集之外使用,因此您不能在代码中使用它。

此 API 支持产品基础结构,不应直接从您的代码中使用。提供从 LinqDataSource 控件中的值创建新类的功能。

所以你实际上尝试使用的是OrderBy内部Queryable类,它是其中的一部分System.Linq,可以如下使用:

.OrderBy(x=> x.sortCol + " " + x.sortDir)
Run Code Online (Sandbox Code Playgroud)

如果您尝试按两列排序,则可以使用:

.OrderBy(x=> x.sortCol).ThenBy(x=> x.sortDir)
Run Code Online (Sandbox Code Playgroud)

如果要动态指定 OrderBy 表达式,可以为每个可能的参数执行 switch 语句,或者按照此SO Answer构建动态表达式树。