Не могли бы вы просто написать:
table.Select(z => new DateTime(z.LastYear, z.LastMonth, z.LastDay));
Хорошо, я проверил это в Linqpad, и кажется, что Linq to SQL действительно решил сгенерировать какой-то странный запрос на преобразование символов. Я не совсем уверен, что это источник проблемы перфорирования, но вы можете вызвать проекцию, как это:
var dates =
(from z in table
select new { Year = z.LastYear, Month = z.LastMonth, Day = z.LastDay })
.AsEnumerable()
.Select(d => new
{
Date = new DateTime(d.Year, d.Month, d.Day),
NextDate = new DateTime(d.Year, d.Month, 1).AddMonths(2).AddDays(-1)
});
Это также даст вам последний день следующего месяца.
Если вы действительно видите такую огромную производительность, разница, тем не менее, я бы рискнул предположить, что вы смотрите не в том месте, и есть что-то другое, что отличается. 90% всех проблем с производительностью, связанных с базой данных, происходят из-за плохой или несуществующей индексации или несаркируемых запросов.