SqlFunctions.StringConvert будет работать, но я нахожу это громоздким, и большую часть времени у меня нет реальной необходимости выполнять преобразование строк на стороне SQL.
Что я делаю, если я хочу выполнять строковые манипуляции, сначала выполняет запрос в linq-to-entity, а затем манипулирует укусами в linq-to-objects. В этом примере я хочу получить набор данных, содержащих полное имя контакта, и ContactLocationKey, который является конкатенацией строк из двух столбцов Integer (ContactID и LocationID).
// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
(from c in Context.Contacts
select new {
c.ContactID,
c.FullName,
c.LocationID
}).ToArray();
// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
(from c in data
select new {
c.FullName,
ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
}).ToArray();
Теперь, я допускаю, что это действительно становится громоздким, чтобы написать два анонимных выбирает, но я бы сказал, что перевешивает удобство которого вы можете выполнить строку (и другие) функции не поддерживаются в L2E. Также имейте в виду, что с помощью этого метода возможно ограничение производительности.
.ToString() не работает для LinqToEF в VB. ИМХО, вроде глупо. – StingyJack
@StingyJack, проблема связана с ELINQ (объектами linq 2), потому что он переводит ваш код в SQL, а когда дело доходит до внутреннего запроса ToString, он не знает, как перевести «ToString» на SQL. В отличие от linq 2 объектов, когда нет перевода, и все это CLR lambdas, то оно выполняется непосредственно на запрошенных объектах. – Shimmy
Я просто раздражен тем, что они позволяют компилировать такую ошибку, и что мне приходилось постоянно трогать, чтобы найти простое английское описание причины (без юридического и академического). – StingyJack