2013-08-14 8 views
31

Pracuję z MVC 4 i muszę zaktualizować moją bazę danych przy użyciu Code First Migrations. Próbuję wybrać rekordy z tabeli bazy danych i wstawić je do listy rozwijanej, na której użytkownik może wybrać.LINQ to Entities nie rozpoznaje metody "System.String ToString()" metoda w MVC 4

mam błąd, że nie rozumiem:

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

Kontroler:

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

[ta odpowiedź] (http://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities) powinno rozwiązać ya – Jonesopolis

+0

lub po prostu użyj LinqToObjects zamiast tego. –

+0

rozwiązany !! dziękuję bardzo – user2232273

Odpowiedz

57

Masz ten błąd, ponieważ Entity Framework nie wie, jak wykonać .ToString() metody w sql. Więc należy załadować dane za pomocą ToList a następnie przełożyć na SelectListItem jak:

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

EDIT: Żeby było jasne, Entity Framework konwertuje wykorzystanie operatorów zapytań takich jak Select, Where ETC w zapytaniu SQL załaduj dane. Jeśli wywołasz metodę taką jak ToString(), której Entity Framework nie ma odpowiednika w sql, będzie ona składać skargę. W związku z tym chodzi o odroczenie korzystania z takich funkcji po załadowaniu danych. ToList, ToArray ETC wymusza wykonanie zapytania, a więc załadowanie danych. Po załadowaniu danych, każda dalsza operacja (taka jak Select, Where ETC) jest wykonywana przy użyciu Linq to Objects, na danych już w pamięci.

+1

wypróbować swoją wersję i to też działa.Bardzo dziękuję – user2232273

+52

Główny problem z tym podejściem, co jeśli wybierzesz z tabeli z tysiącami lub dziesiątkami tysięcy rekordów - ToList przeniesie je wszystkie z bazy danych do obiektu, który następnie zrobisz jeszcze wybierz na . Wysoce nieefektywne - lepiej używać funkcji Sql: Wartość = SqlFunctions.StringConvert (c.id) –

+0

Zadziwiające wyjaśnienie zarówno VarunK, jak i NaytGrochowski –

2

... Co jeśli używasz:

Value = c.id + "", 

zamiast

Value = c.id.ToString(), 

Edit

Dzięki tej opcji nie jest pobieranie wszystkich danych z bazy danych

0

po prostu użyj delegata:

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

Oto jak to zrobić, aby wyświetlić jako SelectList.

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

Aktualna zaakceptowana odpowiedź (przy @VarunK) jest w porządku, jeśli wybierasz wszystkie rekordy i wszystkie kolumny. Jeśli jednak tak nie jest, lepiej zrobić projekcję z wymaganymi kolumnami i rekordami przed zastosowaniem ToList().

Spójrz na Why LINQ to Entities does not recognize the method 'System.String ToString()?.

Inne odniesienia: Problem with converting int to string in Linq to entities

Powiązane problemy