LINQ to Entities无法识别该方法

时间:2014-09-16 19:37:20

标签: c# linq entity-framework

我在@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>&nbsp;&nbsp;
            @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>
}

2 个答案:

答案 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,对于SkipTake存在SQL类似物,并且文字值作为参数传递给生成的SQL查询。但不是ToList

可以在查询的结果上使用.ToList(),如果您想立即实现它:

db.Products.OrderBy(x => x.Name.Skip(pageno* 8).Take(8)).ToList()

这是因为结果基本上是可枚举的,表示准备发送到数据存储的表达式树。它实际上并不会在数据存储实现之前执行。

如果你不这样做,那么你传递给视图的将是一个可以被评估(实现)的可枚举。如果评估它有任何错误,那些错误将使自己在视图的服务器端代码中被识别。如果显式调用.ToList(),那么在评估针对数据存储的LINQ查询时的任何错误都将在控制器中自行识别。