Свяжите интервал и строку в LINQ к Объектам

Я использую следующий код:

from c in Country
 where c.IsActive.Equals(true)
 orderby c.CountryName
 select new
 {
     countryIDCode = c.CountryID + "|" + c.TwoDigitCode,
     countryName = c.CountryName
 }

Но я получаю эту ошибку при выполнении его:

Не мог бросить тип 'Система. Int32' для ввода 'Системы. Объект'. LINQ к Объектам только поддерживает типы примитивов Модели данных Объекта кастинга.

CountryID int тип и TwoDigitCode string ввести.

Как я конкатенирую правильно?

11
задан JasonMArcher 24 June 2015 в 21:25
поделиться

6 ответов

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

var countries = (from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName
select c).ToList();


var countryCodes = (from c in countries
where c.IsActive.Equals(true)
    orderby c.CountryName
    select new
    {
        countryIDCode = c.CountryID + "|" + c.TwoDigitCode,
        countryName = c.CountryName
    });
7
ответ дан 3 December 2019 в 02:01
поделиться

Это ограничение старой версии Entity Framework. Думаю, что с v4 это решено. Для вашей версии обходной путь - преобразовать результат в перечислимое:

from a in 
(from c in Country
where c.IsActive.Equals(true)
orderby c.CountryName).AsEnumerable()
select new
{
    countryIDCode = a.CountryID + "|" + a.TwoDigitCode,
    countryName = a.CountryName
}
2
ответ дан 3 December 2019 в 02:01
поделиться

В этом разделе содержится список методов CLR, которые можно преобразовать в канонические функции дерева команд и выполнить на сервере:

MSDN

Для методов CLR, которых нет в этом списке, вы должны иметь чтобы передать результаты клиенту с помощью .AsEnumerable () и выполнить запрос LINQ to Objects.

5
ответ дан 3 December 2019 в 02:01
поделиться

Используйте c.CountryId.ToString () , чтобы получить строковое представление вашего CountryId и объединить его с полем TwoDigitCode:

from c in Country
 where c.IsActive.Equals(true)
 orderby c.CountryName
 select new
 {
     countryIDCode = c.CountryID.ToString() + "|" + c.TwoDigitCode,
     countryName = c.CountryName
 }

Надеюсь, ваша ошибка на самом деле является ошибкой компилятора (не могу представить в любом случае компилятор разрешит этот запрос (хотя я не уверен, откуда он знает о части Linq to Entities).

-3
ответ дан 3 December 2019 в 02:01
поделиться

Нет отображения канонической функции для int в преобразование строки .

Просто верните Int и String в двух разных столбцах , а затем объедините их в .NET после использования AsEnumerable метод:

var cListTemp = from c in Country
    where c.IsActive.Equals(true)
    orderby c.CountryName
    select new
    {
        countryID = c.CountryID,
        twoDigitCode = c.TwoDigitCode,
        countryName = c.CountryName
    };

var cList = cListTemp.AsEnumerable().Select(c => new {
    countryIDCode = c.countryID + "|" + c.twoDigitCode,
    countryName = c.countryName
});
2
ответ дан 3 December 2019 в 02:01
поделиться

Если вам нужно объединить их в строку, вы можете использовать String.Format метод:

countryIDCode = String.Format("{0}|{1}", c.CountryID, c.TwoDigitCode)
-3
ответ дан 3 December 2019 в 02:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: