Длинный ответ:
Некоторые вещи плохо переводятся из методов CLR в TSQL. Хорошим примером является форматирование даты, поскольку методы .ToString (string s), .ToShort ... и т. Д. Полагаются на целый ряд специфичных для локали настроек для форматирования конечного результата. (Разделители, порядок различных частей даты, какая календарная эра используется, названия месяца / дня и т. Д.). T-SQL не поддерживает все те специфичные для локали вещи, которые поддерживаются в деталях, как .net, и не имеет других диалектов SQL СУБД. Другими словами, перевод метода .net DateTime.ToShortDateString в TSQL приведет к очень большому куску SQL, в котором будут учтены все специфичные для локали факторы форматирования, или, в качестве альтернативы, к методу, возвращающему результат, отличный от .net. эквивалент. (Что было бы еще более запутанным).
Чтобы проиллюстрировать, что при форматировании даты и времени в .net задействовано достаточное количество логики, специфичной для локали, я включил выходные данные DateTime.ToShortDateString и DateTime.ToLongDateString в паре различных настроек языка / языка для сегодняшней даты:
en-us (US English):
11/15/2010
Monday, November 15, 2010
sv-se (Swedish):
2010-11-15
den 15 november 2010
zh-cn (Chinese):
2010/11/15
2010年11月15日
ar-sa (Arabic / Saudi Arabia):
09/12/31
09/ذو الحجة/1431
th-th (Thai):
15/11/2553
15 พฤศจิกายน 2553
Да, все верно, все пять приведенных выше примеров - это одна и та же дата (15 ноября 2010 г.) с разными настройками культуры / локали. Представьте себе размер представления T-SQL всего кода форматирования даты, необходимого для этого. Вероятно, не то, что вы хотели бы поразить вашу базу данных ...:)
Итак, чтобы ответить на ваш вопрос: лучше всего делать форматирование даты и делать другие вещи, которые хорошо подходят .net, но которые нельзя перевести на T-SQL в коде .net. Либо в отдельном классе проекции, у которого есть свойство, которое выполняет форматирование, либо путем проецирования запроса L2E на типы .net, а затем выполните второй запрос L2O (linq-to-objects), который проецирует в новый тип с форматированием и т. Д. преобразования, которые вы можете захотеть сделать.
Краткий ответ:
Выполните это в два этапа - один запрос L2E, выполняющий часть, поддерживаемую L2E, и запрос L2O, выполняющий форматирование даты, и другие действия, которые лучше всего выполнять в коде .net ...
//Linq-to-entities query to get the fullname, categoryname, and date
var query = from c in db.Contacts select new { c.FullName, c.Category.CategoryName, c.DateCreated };
//Linq-to-objects query (.AsEnumerable will separate the L2E from L2O part) that call date formatting methods and other stuff that isn't supported by L2E
var r = from c in query.AsEnumerable() select new { c.FullName, c.CategoryName, ShortDate = c.DateCreated.ToString("D") };
Ответ скопирован с здесь (форум MSDN)