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 нет проблем с использованием первого фрагмента, он работает просто отлично, VB гибок, я не могу привыкнуть к строгости C # !!!
c#
asp.net
linq-to-entities
tostring
Шимми Вайцхандлер
источник
источник
Ответы:
С EF v4 вы можете использовать
SqlFunctions.StringConvert
. Для int нет перегрузки, поэтому вам нужно привести к двойному или десятичному числу. Ваш код в конечном итоге выглядит так:источник
SqlFunctions.StringConvert((double)c.ContactId).Trim()
Я решил аналогичную проблему, поместив преобразование целого числа в строку из запроса. Это может быть достигнуто путем помещения запроса в объект.
источник
Используйте LinqToObject: контакты. AsEnumerable ()
источник
AsEnumerable
вы заплатите высокую цену за большие базы данных, потому что это принесет все в память.IEnumerable
медленнее по сравнению сIQueryable
тем, потому что последний выполняется исключительно в базе данных.SqlFunctions.StringConvert будет работать, но я считаю его громоздким, и большую часть времени у меня нет реальной необходимости выполнять преобразование строк на стороне SQL.
Что я делаю, если я хочу выполнять строковые манипуляции, так это сначала выполнять запрос в linq-to-entity, а затем манипулировать строками в linq-to-objects. В этом примере я хочу получить набор данных, содержащий полное имя Контакта и ContactLocationKey, который является конкатенацией строк двух столбцов Integer (ContactID и LocationID).
Теперь я допускаю, что писать два анонимных выбора становится громоздким, но я бы сказал, что это перевешивает удобство, с которым вы можете выполнять строковые (и другие) функции, не поддерживаемые в L2E. Также имейте в виду, что при использовании этого метода возможно снижение производительности.
источник
источник
return list.ToList();
!!return (from l in db.Customers orderby l.CompanyName select new {Id=l.CustomerID, Name=l.CompanyName}).AsEnumerable().Select(c=> new SelectListItem{Value=c.Id.ToString(), Text = c.Name}).ToList();
. Делая это таким образом, только получает идентификатор / имя из базы данных (вместо всех свойств клиента) и выполняет сортировку, используя более эффективный индекс в базе данных.Сначала преобразуйте в объект, затем toString () будет корректным.
источник
Ответ Брайана Котона превосходен! Небольшое обновление для EF 6, класс переместился в другое пространство имен. Итак, перед EF 6 вы должны включить:
Если вы обновляетесь до EF 6 или просто используете эту версию, включите:
Включив некорректное пространство имен в EF6, код будет прекрасно компилироваться, но выдает ошибку времени выполнения. Я надеюсь, что эта заметка поможет избежать путаницы.
источник
Я столкнулся с этой же проблемой, когда я конвертировал свое приложение MVC 2 в MVC 3, и просто чтобы дать другое (чистое) решение этой проблемы, я хочу опубликовать то, что я сделал ...
GetProducers () просто возвращает коллекцию сущностей Producers. PS SqlFunctions.StringConvert не работает для меня.
источник
Если ваш «контакт» действует как общий список, я надеюсь, что следующий код работает хорошо.
Спасибо.
источник
Еще одно решение:
Просто добавьте пустую строку, и она будет преобразована в строку.
источник
Используя MySql, у
SqlFunctions.StringConvert
меня не получилось. Поскольку я используюSelectListItem
более 20 мест в своем проекте, я хотел, чтобы решение работало без искажения более 20 операторов LINQ. Мое решение было подклассаSelectedListItem
в том, чтобы создать для обеспечения целочисленного сеттера, который перемещает преобразование типов из LINQ. Очевидно, что это решение сложно обобщить, но оно оказалось весьма полезным для моего конкретного проекта.Чтобы использовать, создайте следующий тип и используйте его в своем запросе LINQ вместо
SelectedListItem
и используйте IntValue вместо Value.источник
если вы используете Entity Framework и хотите сделать единственное int приемлемым, вы можете использовать это в запросе linq, вы можете попробовать это
это будет работать, потому что использование (int) приведёт ваше значение к int, поэтому вам не нужно преобразовывать строку в int, и вы получите желаемый результат.
это сработало для меня в моем проекте, я думаю, что это будет полезно для вас
источник
Насколько я понимаю, вам нужно создать частичный класс, чтобы «расширить» вашу модель и добавить свойство, предназначенное только для чтения, которое может использовать остальные свойства класса.
затем
источник
Я обнаружил, что
SqlFunctions.StringConvert((double)c.Age)
у меня не работает либо поле имеет типNullable<Int32>
Мне понадобилось много поисков за последние несколько дней проб и ошибок, чтобы найти это.
Надеюсь, это поможет нескольким программистам.
источник
System.String Concat(System.Object)
не может быть переведено в выражение магазина ... ".Ты можешь попробовать:
источник