代码之家  ›  专栏  ›  技术社区  ›  IDeveloper

OData order by navigation属性

  •  0
  • IDeveloper  · 技术社区  · 11 年前

    我想消费 Northwind ASP.NET MVC项目中的OData服务,并使用WebGrid控件进行可视化。我使用服务URL使用Visual Studio 2012创建服务引用。问题在于WebGrid的排序。当我尝试在导航字段(如CategoryName)上对其进行排序时,我收到一个错误:“类型'Product'中不存在'CategoryName'属性或字段”。我理解错误,但我不知道如何使其工作并获得所需的部分数据。如有任何帮助,我们将不胜感激。 控制器:

    private ODataNorthwind.NorthwindEntities context = new ODataNorthwind.NorthwindEntities(new Uri("http://services.odata.org/Northwind/Northwind.svc"));
        //
        // GET: /Odata/
    
        public ActionResult WebGrid(int page = 1, int rowsPerPage = 10, string sort = "ProductID", string sortDir = "ASC")
        {
            var data = GetProducts(page, rowsPerPage, sort, sortDir);
            return View(data);
        }
    
        // Data for WebGridObj
        private WebGridViewModel GetProducts(int page = 1, int rowsPerPage = 10, string sort = "ProductID", string sortDir = "ASC")
        {
            var query = context.Products.OrderBy(sort + " " + sortDir)
                .Select(p => new
                {
                    p.ProductID,
                    p.ProductName,
                    p.Category.CategoryName,
                    p.Supplier.CompanyName,
                    p.Supplier.Country
                });
    
            WebGridViewModel model = new WebGridViewModel
            {
                TotalRows = query.Count(),
                Products = query.Skip((page - 1) * rowsPerPage).Take(rowsPerPage).ToList().Select(p =>
                   new HtmlViewModel
                   {
                       ProductId = p.ProductID,
                       ProductName = p.ProductName,
                       CategoryName = p.CategoryName,
                       CompanyName = p.CompanyName,
                       Country = p.Country
                   })
            };
            return model;
        }
    

    视图:

    @{
        ViewBag.Title = "WebGrid";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }
    
    <h2>OData WebGrid</h2>
    
    <div>
    @{
        var grid = new WebGrid(null, defaultSort: "ProductId");
        grid.Bind(Model.Products, rowCount: Model.TotalRows, autoSortAndPage: false);
    }
    @grid.GetHtml(columns: grid.Columns(
        grid.Column("ProductId"),
        grid.Column("ProductName"),
        grid.Column("CategoryName"),
        grid.Column("CompanyName"),
        grid.Column("Country")
        ))
    </div>
    
    1 回复  |  直到 11 年前
        1
  •  3
  •   Eonasdan Alex Mckay    10 年前

    经过 Category/CategoryName 而不是 CategoryName 因为调用GetProducts时参数的排序值可以解决此问题。

    http://services.odata.org/Northwind/Northwind.svc/Products?
         $expand=Category&$orderby=Category/CategoryName