Объединить int и строку в LINQ to Entities - PullRequest
11 голосов
/ 21 апреля 2010

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

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.

Как правильно объединить?

Ответы [ 8 ]

22 голосов
/ 22 февраля 2012

Использовать 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
 }
7 голосов
/ 21 апреля 2010

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

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

* MSDN 1004 *

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

2 голосов
/ 12 апреля 2012

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

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))).

2 голосов
/ 21 апреля 2010

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

Так что просто верните Int и String в 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
});
2 голосов
/ 21 апреля 2010

Это ограничение старой версии 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
}
0 голосов
/ 21 апреля 2010

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

countryIDCode = String.Format("{0}|{1}", c.CountryID, c.TwoDigitCode)
0 голосов
/ 21 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...