【问题标题】:OData order by navigation propertyOData 按导航属性排序
【发布时间】:2014-03-22 05:56:40
【问题描述】:

我正在尝试在 ASP.NET MVC 项目中使用 Northwind 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>

【问题讨论】:

    标签: c# asp.net linq-to-entities odata wcf-data-services


    【解决方案1】:

    在调用GetProducts时传递Category/CategoryName而不是CategoryName作为参数的排序值可以解决这个问题。

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

    【讨论】:

    • 不是一个完整的解决方案,但感谢有用的提示!我使用'AddQueryOption("$orderby", orderBy + " " + sortDir.ToLower() 而不是OrderBy 并按列传递正确的顺序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多