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

var items = from c in contacts select new ListItem { Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value). Text = c.Name }; var items = from c in contacts select new ListItem { Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities. Text = c.Name }; 

В любом случае, я могу это достичь? Обратите внимание, что в VB.NET нет проблем с использованием первого fragmentа, который он отлично работает, VB является гибким, im неспособным привыкнуть к строгости C # !!!

С EF v4 вы можете использовать SqlFunctions.StringConvert . Нет перегрузки для int, поэтому вам нужно использовать двойную или десятичную. Ваш код выглядит следующим образом:

 var items = from c in contacts select new ListItem { Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(), Text = c.Name }; 

Я решил аналогичную проблему, поставив преобразование целого числа в строку из запроса. Это может быть достигнуто путем помещения запроса в объект.

 var items = from c in contacts select new { Value = c.ContactId, Text = c.Name }; var itemList = new SelectList(); foreach (var item in items) { itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name }); } 

Используйте LinqToObject: контакты. AsEnumerable ()

 var items = from c in contacts.AsEnumerable() select new ListItem { Value = c.ContactId.ToString(), Text = c.Name }; 
 public static IEnumerable GetCustomerList() { using (SiteDataContext db = new SiteDataContext()) { var list = from l in db.Customers.AsEnumerable() orderby l.CompanyName select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName }; return list.ToList(); } } 

SqlFunctions.StringConvert будет работать, но я нахожу его громоздким, и большую часть времени у меня нет реальной необходимости выполнять преобразование строк на стороне SQL.

То, что я делаю, если хочу выполнять строковые манипуляции, сначала выполняет запрос в linq-to-entity, а затем манипулирует укусами в linq-to-objects. В этом примере я хочу получить dataset, содержащих полное имя контакта, и ContactLocationKey, который является конкатенацией строк из двух столбцов Integer (ContactID и LocationID).

 // perform the linq-to-entities query, query execution is triggered by ToArray() var data = (from c in Context.Contacts select new { c.ContactID, c.FullName, c.LocationID }).ToArray(); // at this point, the database has been called and we are working in // linq-to-objects where ToString() is supported // Key2 is an extra example that wouldn't work in linq-to-entities var data2 = (from c in data select new { c.FullName, ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(), Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString()) }).ToArray(); 

Теперь я признаю, что громоздко приходится писать два анонимных выбора, но я бы сказал, что это перевешивает удобство, с помощью которого вы можете выполнять строковые (и другие) функции, не поддерживаемые в L2E. Также имейте в виду, что с помощью этого метода возможно ограничение производительности.

 var selectList = db.NewsClasses.ToList().Select(a => new SelectListItem({ Text = a.ClassName, Value = a.ClassId.ToString() }); 

Во-первых, конвертировать в объект, то toString () будет правильным.

Я столкнулся с этой же проблемой, когда я конвертировал свое приложение MVC 2 в MVC 3 и просто чтобы дать другое (чистое) решение этой проблемы, я хочу опубликовать то, что я сделал …

 IEnumerable producers = new SelectList(Services.GetProducers(), "ID", "Name", model.ProducerID); 

GetProducers () просто возвращает коллекцию сущностей Producers. PS SqlFunctions.StringConvert не работал для меня.

Если ваш «контакт» действует как общий список, я надеюсь, что следующий код работает хорошо.

 var items = contact.Distinct().OrderBy(c => c.Name) .Select( c => new ListItem { Value = c.ContactId.ToString(), Text = c.Name }); 

Благодарю.

Ответ Брайана Каутона превосходный! Просто небольшое обновление для EF 6, class переместился в другое пространство имен. Итак, перед EF 6 вы должны включить:

 System.Data.Objects.SqlClient 

Если вы обновляетесь до EF 6 или просто используете эту версию, включите:

 System.Data.Entity.SqlServer 

Включив неправильное пространство имен с EF6, код будет компилироваться просто отлично, но приведет к ошибке выполнения. Надеюсь, эта заметка поможет избежать некоторой путаницы.

Используя MySql, SqlFunctions.StringConvert не работал для меня. Поскольку я использую SelectListItem в 20+ местах в моем проекте, мне нужно решение, которое работает без искажений 20+ операторов LINQ. Мое решение заключалось в подclassе SelectedListItem , чтобы обеспечить целочисленный сеттер, который перемещает преобразование типов из LINQ. Очевидно, что это решение сложно обобщить, но было весьма полезно для моего конкретного проекта.

Чтобы использовать, создайте следующий тип и используйте в своем запросе LINQ вместо SelectedListItem и используйте IntValue вместо Value.

 public class BtoSelectedListItem : SelectListItem { public int IntValue { get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); } set { Value = value.ToString(); } } } 

Еще одно решение:

 c.ContactId + "" 

Просто добавьте пустую строку, и она будет преобразована в строку.

если вы используете фреймворк сущности и хотите сделать единственное int приемлемым, то вы можете использовать это в запросе linq, вы можете попробовать это

 var items = from c in contacts select new ListItem { Value = (int)ContractId Text = c.Name }; 

он будет работать, потому что использование (int) приведет ваше значение к int, поэтому вам не нужно преобразовать строку в int, и вы получите нужный результат.

это сработало для меня в моем проекте, я думаю, это было бы полезно для вас

Самый простой способ:

 var items = from c in contacts select new ListItem { Value = c.ContactId + "", Text = c.Name }; 

Я понимаю, что вам нужно создать частичный class, чтобы «расширить» вашу модель и добавить свойство, которое только для чтения, которое может использовать остальные свойства classа.

 public partial class Contact{ public string ContactIdString { get{ return this.ContactId.ToString(); } } } 

затем

 var items = from c in contacts select new ListItem { Value = c.ContactIdString, Text = c.Name }; 
 var items = from c in contacts select new ListItem { Value = String.Concat(c.ContactId), //This Works in Linq to Entity! Text = c.Name }; 

Я обнаружил, что SqlFunctions.StringConvert((double)c.Age) не работает для меня, либо поле имеет тип Nullable

В течение последних нескольких дней испытаний и ошибок я много искал, чтобы найти это.

Надеюсь, это поможет нескольким кодировщикам.

Ты можешь попробовать:

 var items = from c in contacts select new ListItem { Value = Convert.ToString(c.ContactId), Text = c.Name }; 
  • Как преобразовать трассировку стека в строку?
  • Почему объект Object.toString () по умолчанию возвращает шестнадцатеричное представление hash-кода?
  • Преобразовать вектор в строку
  • to_string не является членом std, говорит g ++ (mingw)
  • Почему метод toString в java не работает для массива
  • Как преобразовать массив int в String с помощью метода toString в Java
  • Смутно о __str__ в списке в Python
  • Явный vs неявный вызов toString
  • BigInteger - Hex / Decimal / Octal / Binary string?
  • Давайте будем гением компьютера.