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);
}
Ответы
Ответ 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 для объектов