web-dev-qa-db-fra.com

LINQ to Entities ne reconnaît pas la méthode "System.String ToString ()" dans MVC 4

Je travaille avec MVC 4 et je dois mettre à jour ma base de données à l'aide de Code First Migrations. Ce que j'essaie de faire est de sélectionner des enregistrements dans une table de base de données et de les insérer dans une liste déroulante dans laquelle l'utilisateur peut en sélectionner un.

J'ai une erreur que je ne comprends pas:

LINQ to Entities does not recognize the method 'System.String ToString()' method, and this method cannot be translated into a store expression.

Manette:

  public ActionResult Addnew()
        {
            var dba = new DefaultConnection();
            var query = dba.blob.Select(c => new SelectListItem
            {
                Value = c.id.ToString(),
                Text = c.name_company,
                Selected = c.id.Equals(3)
            });
            var model = new Companylist
            {
                xpto = query.AsEnumerable()
            };

            return View(model);
        }
32
user2232273

Vous avez cette erreur car Entity Framework ne sait pas comment exécuter la méthode .ToString() dans SQL. Donc, vous devriez charger les données en utilisant ToList et ensuite traduire en SelectListItem comme:

var query = dba.blob.ToList().Select(c => new SelectListItem
    {
    Value = c.id.ToString(),
    Text = c.name_company,
    Selected = c.id.Equals(3)
});

Éditer: pour que ce soit plus clair, Entity Framework convertit votre utilisation d'opérateurs de requête tels que Select, Where ETC en une requête SQL pour charger les données. Si vous appelez une méthode telle que ToString(), pour laquelle Entity Framework n'a pas d'équivalent dans sql, il se plaindra. SO L'idée est de différer l'utilisation de ces fonctions après le chargement des données. ToList, ToArray ETC force l'exécution de la requête et charge ainsi les données. Une fois les données chargées, toute opération ultérieure (telle que Select, Where ETC) est effectuée à l'aide de Linq to Objects, sur les données déjà en mémoire.

58
Varun K

Et si ... vous utilisez:

Value = c.id + "",

au lieu de

Value = c.id.ToString(),

Modifier

Avec cette option, vous ne récupérez pas toutes les données de la base de données

2
Leandro Soares

il suffit d'utiliser délégué:

var query = dba.blob.Select(delegate(blob c)
{
    return new SelectListItem
        {
            Value = c.id.ToString(),
            Text = c.name_company,
            Selected = c.id.Equals(3)
        };
});
0
Ali7091

Voici comment je le fais pour afficher en tant que liste de sélection.

 public List<BlobEntity> GetBlobs()
    {
        List<BlobEntity> blobs = null;
        using (var db = new MyDBEntities())
        {
            blobs = (from b in db.blobs
                     where b.id > 0 //Example filter
                     select new BlobEntity
                     {
                         ID = b.id,
                         CompanyName = b.name_company
                     }
                     ).ToList();

        }
        return blobs;
    }

   public static SelectList GetBlobsSelectList()
    {
        MyBL theBL = new MyBL();
        List<BlobEntity> blobEntites = theBL.GetBlobs();
        var listItems = blobEntites
             .Select(x => new SelectListItem { Text = x.CompanyName,
                                                Value = x.ID.ToString()
                                             })
             .ToList();
        SelectList blobsSelectList = new SelectList(listItems.AsEnumerable(), "Value", "Text");
        return blobsSelectList;
    }

   public class BlobEntity
   {
       public int ID { get; set; }
       public string CompanyName { get; set; }
   }

La réponse acceptée actuellement (par @VarunK) est acceptable si vous sélectionnez tous les enregistrements et toutes les colonnes. Toutefois, si ce n'est pas le cas, il est préférable de faire une projection avec les colonnes et les enregistrements requis avant d'appliquer ToList().

Regardez Pourquoi LINQ to Entities ne reconnaît-il pas la méthode 'System.String ToString ()?.

Autres références: Problème de conversion de int en chaîne dans Linq en entités

0
Lijo