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>
错误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.MyModel
的new
关键字。所以最后的声明是:
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()
之前)。