Объединить int и строку в LINQ к объектам

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

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

Но я получаю эту ошибку при ее запуске:

Невозможно ввести тип "System.Int32" для ввода "System.Object". LINQ to Entities поддерживает только листинг примитивных типов данных Entity Data Model.

CountryID имеет тип int, а тип TwoDigitCode - string.

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

Ответ 1

Если эта ошибка мешает вам развиваться и представляет собой небольшой набор данных, вы можете убрать ваш доход из базы данных путем перечисления запроса (вызов 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
    });

Ответ 2

Использовать System.Data.Objects.SqlClient.SqlFunctions.StringConvert

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

Ответ 3

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

MSDN

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

Ответ 4

Это ограничение старой версии 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
}

Ответ 5

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

Итак, просто верните Int и строку в 2 разных столбца, а затем объедините их в .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
});

Ответ 6

Мне удалось объединить строки со следующим кодом:

l.StateName + " " + SqlFunctions.StringConvert( (double?)l.Zip ).Trim()

Кажется, что только SqlFunctions.StringConvert( (double?)l.Zip ) будет достаточно хорошим, но в результате строка имеет кучу отступов слева, что приводит к тому, что сравнения строк не совпадают. Оказывается, Trim() работает, чтобы сбрить лишний. Я считаю, что SqlFunctions.StringConvert( (double?)l.Zip ).Trim() эффективно превращается в SQL: LTrim(RTrim(STR(Zip))).

Ответ 7

Используйте 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, хотя).

Ответ 8

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

countryIDCode = String.Format("{0}|{1}", c.CountryID, c.TwoDigitCode)