wake-up-neo.net

LINQ to Entities erkennt die Methode 'System.String ToString ()' in MVC 4 nicht

Ich arbeite mit MVC 4 und muss meine Datenbank mit Code First Migrations aktualisieren. Ich versuche, Datensätze aus einer Datenbanktabelle auszuwählen und sie in eine Dropdown-Liste einzufügen, in der der Benutzer einen auswählen kann.

Ich habe einen Fehler, den ich nicht verstehe:

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

Controller:

  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

Sie haben diesen Fehler erhalten, weil Entity Framework nicht weiß, wie die .ToString()-Methode in SQL ausgeführt wird. Sie sollten also die Daten mit ToList laden und dann in SelectListItem übersetzen:

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

Bearbeiten: Um es übersichtlicher zu machen, konvertiert das Entity Framework Ihre Verwendung von Abfrageoperatoren wie Select, Where ETC in eine SQL-Abfrage, um die Daten zu laden. Wenn Sie eine Methode wie ToString() aufrufen, deren Entity Framework in sql keine Entsprechung hat, wird dies beanstandet. SO Die Idee ist, die Verwendung solcher Funktionen nach dem Laden der Daten zu verschieben. ToList, ToArray ETC erzwingt die Ausführung der Abfrage, wodurch Daten geladen werden. Sobald die Daten geladen sind, werden alle weiteren Vorgänge (z. B. Select, Where ETC) mit Linq to Objects für die bereits im Speicher befindlichen Daten ausgeführt.

58
Varun K

Was ist, wenn ... Sie verwenden:

Value = c.id + "",

anstatt

Value = c.id.ToString(),

Bearbeiten

Mit dieser Option rufen Sie nicht alle Daten aus der Datenbank ab

2
Leandro Soares

benutze einfach delegate:

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

Das Folgende ist, wie ich es mache, um als SelectList anzuzeigen.

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

Die aktuell akzeptierte Antwort (von @VarunK) ist in Ordnung, wenn Sie alle Datensätze und alle Spalten auswählen. Ist dies jedoch nicht der Fall, ist es besser, eine Projektion mit den erforderlichen Spalten und Datensätzen durchzuführen, bevor Sie ToList() anwenden.

Schauen Sie sich Warum erkennt LINQ to Entities die Methode 'System.String ToString ()? nicht.

Andere Verweise: Problem beim Konvertieren von int in string in Linq in entity

0
Lijo