Подтвердить что ты не робот

LINQ to Entities не распознает метод "System.String ToString()" в MVC 4

Я работаю с MVC 4, и мне нужно обновить мою базу данных, используя First First Migrations. То, что я пытаюсь сделать, - это выбрать записи из таблицы базы данных и вставить их в раскрывающийся список, где пользователь может выбрать его.

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

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

Ответ 1

Вы получили эту ошибку, потому что 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)
});

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

Ответ 2

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

Value = c.id + "",

вместо

Value = c.id.ToString(),

Edit

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

Ответ 3

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

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

Ответ 4

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

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

Взгляните на Почему LINQ to Entities не распознает метод" System.String ToString()?.

Другие ссылки: Проблема с преобразованием int в строку в Linq для объектов