MVC 4应用程序中linq查询和扩展之间的差异

本文关键字:之间 扩展 查询 应用程序 linq MVC | 更新日期: 2023-09-27 18:26:23

我有一个控制器,它将3个表链接在一起。我知道如何在web网格上显示它,但在web网格的一些功能以及MVC 4 Basic应用程序中linq查询和扩展之间的差异方面遇到了问题。

以下是控制器的要求:

当显示这样的页面时,控制器必须接收以下MVC参数:

  • 页面:页码,从1开始,默认为1
  • rowsPerPage:每页的行数(页面大小),默认为10
  • 排序:排序列的名称,默认ProductID
  • sortDir:排序方向,ASC或DESC,默认ASC

进一步排序:最初在ProductID ASC上;然后,单击列标题主要对该列进行排序,交替使用ASC和DESC;然后在ProductID ASC上进行二次排序(明确地断开连接,如果有的话)

这是我的代码,我可以让链接表显示,但我不知道如何按列排序等。

控制器中的相关代码:

 string SwdConStr = @"Data Source=(LocalDB)'v11.0;AttachDbFilename=|DataDirectory|'southwnd.mdf;Integrated Security=True;Connect Timeout=30";
public ActionResult WebGrid_SQL(string sort = "ProductID", string sortDir = "ASC", int rowsPerPage = 10, int page = 1)
    {
        var swd = new Southwind(SwdConStr);
        var sortCriteria = // should do better
            string.Format("{0} {1}, ProductID {1}", sort, sortDir);
        var res =
            from p in swd.Products
            join c in swd.Categories on p.CategoryID equals c.CategoryID
            join s in swd.Suppliers on c.CategoryID equals s.SupplierID
            orderby (sortCriteria)
            //.Skip((page - 1) * rowsPerPage)
            //  .Take(rowsPerPage)
            .Select(m => AS3.Models.MyModel
            {
                ProductID = p.ProductID,
                ProductName = p.ProductName,
                CategoryName = c.CategoryName,
                CompanyName = s.CompanyName,
                ContactName = s.ContactName,
                Country = s.Country
            }).ToList();
        ViewBag.sort = sort;
        //ViewBag.sortDir = sortDir;
        //ViewBag.rowsPerPage = rowsPerPage;
        //ViewBag.page = page;
        ViewBag.count = swd.Products.Count();
        return View(res);
    }

请注意,上面的代码在网页上显示了正确的表格,但它没有排序功能等。

上面的代码有两个错误,都在ToList 后面的分号处

  • 错误1查询正文必须以select子句或group子句结尾
  • 错误2无法将lambda表达式转换为类型"string",因为它不是委托类型

此外,如果有人需要查看视图来解决问题:

视图中的相关代码:

 @model IEnumerable<AS3.Models.MyModel>
 @{
 ViewBag.Title = "WebGrid SQL";
 }
 @{  // copy local = true
 var grid = new System.Web.Helpers.WebGrid(null,
    defaultSort: ViewBag.sort);
    //rowsPerPage: ViewBag.rowsPerPage);
 grid.Bind(Model, rowCount: ViewBag.count, autoSortAndPage: false);
 }
<h2>WebGrid SQL</h2>
<div>
    @grid.GetHtml(
       columns: grid.Columns(
        grid.Column("ProductID", "Product ID", canSort: true),
        grid.Column("ProductName", "Product Name", canSort: true),
        grid.Column("CategoryName", "Category Name", canSort: true),
        grid.Column("CompanyName", "Company Name", canSort: true),
        grid.Column("ContactName", "Contact Name", canSort: true),
        grid.Column("Country", "Country", canSort: true)
      )
  )
      <h3>Ordering by:</h3>
     <div>@grid.SortColumn @grid.SortDirection</div>
  </div>

MVC 4应用程序中linq查询和扩展之间的差异

错误1查询正文必须以select子句或group子句结尾

在查询语法中,LINQ语句应始终以select子句结尾。所以这是要做的第一件事:

var res = from p in swd.Products
          join c in swd.Categories on p.CategoryID equals c.CategoryID
          join s in swd.Suppliers on c.CategoryID equals s.SupplierID
          orderby (sortCriteria)
          select ...

请注意,这与…不同

(from p in swd.Products
  join c in swd.Categories on p.CategoryID equals c.CategoryID
  join s in swd.Suppliers on c.CategoryID equals s.SupplierID
  orderby (sortCriteria))
.Select(x => ....)

因为括号之间的部分仍然是一个请求select子句的"查询体"。

错误2无法将lambda表达式转换为类型"string",因为它不是委托类型

这是在许多情况下发生的错误,某些的lambda表达式有问题。一个常见的原因是没有using System.Linq。但您的语句中有一个明显的缺陷:sortCriteria只是一个字符串,但您应该在其中输入属性名称,比如。。。

var res = from p in swd.Products
          join c in swd.Categories on p.CategoryID equals c.CategoryID
          join s in swd.Suppliers on c.CategoryID equals s.SupplierID
          orderby p.ProductID
          select ...

最后,没有用于创建AS3.Models.MyModelnew关键字。所以最后的声明是:

var res = (from p in swd.Products
          join c in swd.Categories on p.CategoryID equals c.CategoryID
          join s in swd.Suppliers on c.CategoryID equals s.SupplierID
          orderby p.ProductID
          select new AS3.Models.MyModel
          {
              ProductID = p.ProductID,
              ProductName = p.ProductName,
              CategoryName = c.CategoryName,
              CompanyName = s.CompanyName,
              ContactName = s.ContactName,
              Country = s.Country
          }).ToList();

现在这不允许动态排序。如果你想的话,你可以看看这个:IEnumerable<T>。这将允许您在声明中添加类似.OrderByDescending("ProductID")的内容。(ToList()之前)。