Объединить 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)