Проблема с преобразованием 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 # !!!
- Настройте точку вместо запятой в числовых значениях
- Как изменить символ для десятичной точки в double.ToString ()?
- Обратный (проанализировать вывод) массива Array.toString (int )
- Почему конверсия туда и обратно с помощью строки, небезопасной для двойной?
- Как «cout» правильное количество десятичных знаков двойного значения?
- Преобразование xml в строку с помощью jQuery
- Как автоматически отображать все свойства classа и их значения в строке?
- когда использовать метод toString ()
С 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 };