我在@foreach(var item in Model)
行中收到此错误。
我该如何解决?
LINQ to Entities无法识别该方法 'System.Collections.Generic.List
1[System.Char] ToList[Char](System.Collections.Generic.IEnumerable
1 [System.Char])' 方法,并且此方法无法转换为商店表达式。
控制器
public ActionResult ProductIndex(int pageno= 0)
{
ViewBag.PageNumber= Paging.CountPageNumber(db.Products.Count(), 8);
ViewBag.ActivePageNo= sayfaNo;
var product = db.Products.OrderBy(x =>
x.Name.Skip(pageno* 8).Take(8).ToList());
return View(product);
}
查看
<tr>
<th>ID</th>
<th>Name</th>
<th>Price</th>
<th>Brand</th>
<th>Category</th>
<th>Size</th>
<th>Stock</th>
<th>Active</th>
<th>Edit</th>
</tr>
@foreach (var item in Model)
{
<tr>
<td>@item.Id</td>
<td class="box-title" data-original-title="click to edit">
@Html.ActionLink(item.Name, "ProductDetails", new { id = item.Id })
</td>
<td>@item.Price</td>
<td>@item.Brand</td>
<td>@item.Category.Name</td>
<td>@item.Size</td>
<td>@item.StockQuantity</td>
@if (item.IsActive)
{
<td>Aktif</td>
}
else
{
<td>Pasif</td>
}
<td>
<a href="../Admin/SupplierEdit/@item.Id">
<i class="fa fa-pencil-square-o"></i>Edit
</a>
@if (item.IsActive)
{
<a href="../Admin/ProductDelete/@item.Id">
<i class="fa fa-minus-circle"></i>Delete
</a>
}
else
{
<a href="../Admin/ProductDelete/@item.Id">
<i class="fa fa-check"></i>Activate
</a>
}
</td>
</tr>
}
答案 0 :(得分:7)
你的LINQ中的错误位置有一个括号:
db.Products.OrderBy(x => x.Name.Skip(pageno* 8).Take(8).ToList());
你想:
db.Products.OrderBy(x => x.Name).Skip(pageno* 8).Take(8).ToList();
实际上,它直到视图(然后出错)才真正执行查询,因为您没有在外部查询上调用ToList
。 EF仅在需要时检索数据。
后一种查询对于分页非常常见。前者并没有多大意义。
答案 1 :(得分:0)
LINQ to Entities正在构建一个表达式树并将其转换为代码,以针对数据存储(可能是SQL数据库)执行。 SQL中没有.ToList()
的概念。
在这一行:
db.Products.OrderBy(x => x.Name.Skip(pageno* 8).Take(8).ToList())
OrderBy
内的所有内容都将在SQL服务器上执行 。所以你不需要.ToList()
:
db.Products.OrderBy(x => x.Name.Skip(pageno* 8).Take(8))
对于OrderBy
,对于Skip
,Take
存在SQL类似物,并且文字值作为参数传递给生成的SQL查询。但不是ToList
。
您可以在查询的结果上使用.ToList()
,如果您想立即实现它:
db.Products.OrderBy(x => x.Name.Skip(pageno* 8).Take(8)).ToList()
这是因为结果基本上是可枚举的,表示准备发送到数据存储的表达式树。它实际上并不会在数据存储实现之前执行。
如果你不这样做,那么你传递给视图的将是一个可以被评估(实现)的可枚举。如果评估它有任何错误,那些错误将使自己在视图的服务器端代码中被识别。如果显式调用.ToList()
,那么在评估针对数据存储的LINQ查询时的任何错误都将在控制器中自行识别。