2013-08-14 1 views
31

Я работаю с MVC 4, и мне нужно обновить мою базу данных с помощью First First Migrations. То, что я пытаюсь сделать, - это выбрать записи из таблицы базы данных и вставить их в раскрывающийся список, где пользователь может выбрать его.LINQ to Entities не распознает метод «System.String ToString()» в MVC 4

У меня есть ошибка, что я не понимаю:

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

Контроллер:

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

[этот ответ] (http://stackoverflow.com/questions/1066760/problem-with-converting-int-to-string-in-linq-to-entities) следует исправить ya – Jonesopolis

+0

или просто используйте LinqToObjects. –

+0

решено !! большое спасибо – user2232273

ответ

57

Вы получили эту ошибку, потому что Entity Framework не знает, как выполнить .ToString() метод в sql. Таким образом, вы должны загрузить данные с помощью ToList, а затем перевести в SelectListItem как:

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

Edit: Для того, чтобы сделать его более ясным, рамки Entity преобразует использование операторов запросов, таких как Select, Where ETC в SQL-запрос к загрузить данные. Если вы вызываете метод, подобный ToString(), который у Entity Framework не имеет эквивалента в sql, он будет жаловаться. Итак, идея состоит в том, чтобы отложить использование таких функций после загрузки данных. ToList, ToArray ETC принудительно выполняет запрос, таким образом, загружая данные. После загрузки данных любая дальнейшая операция (например, Select, Where ETC) выполняется с использованием Linq to Objects по уже находящимся в памяти данным.

+1

попробовали свою версию, и она тоже работает.Большое спасибо – user2232273

+52

Основная проблема с этим подходом: что если вы выберете из таблицы с тысячами или десятками тысяч записей - ToList вытащит их все из базы данных в объект, который вы затем сделаете еще один выбор на , Очень неэффективно - лучше использовать SqlFunctions: Value = SqlFunctions.StringConvert (c.id) –

+0

Удивительное объяснение как VarunK, так и NaytGrochowski –

2

Что делать, если ... вы используете:

Value = c.id + "", 

вместо

Value = c.id.ToString(), 

Редактировать

С помощью этой опции вы не извлечение всех данных из базы данных

0

просто использовать делегат:

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

Ниже показано, как я это делаю, чтобы отображать как 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; } 
    } 

В настоящее время общепринятого ответа (по @VarunK) в порядке, если вы выбираете все записи и все столбцы. Однако, если это не так, лучше сделать прогноз с требуемыми столбцами и записями перед применением ToList().

Посмотрите на Why LINQ to Entities does not recognize the method 'System.String ToString()?.

Другие ссылки: Problem with converting int to string in Linq to entities

Смежные вопросы