2014-09-16 4 views
1

Je reçois cette erreur dans la ligne @foreach(var item in Model).LINQ to Entities ne reconnaît pas la méthode

Comment puis-je résoudre ce problème?

LINQ to Entities ne reconnaît pas la méthode 'System.Collections.Generic.List 1[System.Char] ToList[Char](System.Collections.Generic.IEnumerable 1 [System.Char])' méthode , et cette méthode ne peut pas être traduit en une expression de magasin.

Contrôleur

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); 
} 

Voir

<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> 
} 

Répondre

7

vous avez une parenthèse au mauvais endroit dans votre LINQ:

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

Vous voulez:

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

Comme il est, il ne fait la requête exécute jusqu'à ce que la vue (et erroring ensuite), parce que vous n'êtes pas appeler ToList sur la requête externe. EF récupère uniquement les données lorsque cela est nécessaire.

Cette dernière requête est très courante pour la pagination. Le premier n'a pas vraiment de sens.

+0

merci beaucoup. mon erreur. il fonctionne maintenant. – livefreeor

+0

@livefreeor chose sûre. Si la réponse vous a aidé, je vous serais reconnaissant si vous l'avez marqué comme correct – Jonesopolis

0

LINQ to Entities construit une arborescence d'expression et la traduit en code à exécuter sur le magasin de données, probablement une base de données SQL. Il n'y a pas de concept de .ToList() en SQL.

Dans cette ligne:

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

Tout à l'intérieur de la OrderBy va être exécuté sur le serveur SQL. Donc, vous n'avez pas besoin .ToList():

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

Il existe des analogues SQL pour OrderBy, pour Skip, pour Take, et les valeurs littérales sont transmises en tant que paramètres à la requête SQL résultante. Mais pas ToList.

Vous pouvez utiliser .ToList() sur le résultat de la requête, si vous voulez matérialiser immédiatement:

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

En effet, le résultat est essentiellement le dénombrable représentant l'arbre d'expression qui est prêt à être envoyé au magasin de données. Il ne s'exécute pas réellement contre le magasin de données jusqu'à ce que quelque chose le matérialise.

Si vous ne le faites pas, ce que vous passez à la vue sera un élément énumérable prêt à être évalué (matérialisé). Si des erreurs l'évaluent, ces erreurs se feront connaître dans le code côté serveur de la vue.Si vous appelez explicitement .ToList() alors toute erreur dans l'évaluation de la requête LINQ par rapport au magasin de données se fera connaître dans le contrôleur.

+2

Ce que vous dites est correct, mais comme «x.Nom.Skip (pageno * 8) .Take (8)» est une option incroyablement improbable à * * order ** par les éléments, il y a de fortes chances que la parenthèse fermante soit belonngs après 'Name', pas après' Take (8) '... – oerkelens

Questions connexes