Ответ 1
Вы ищете SqlMethods.DateDiffMonth
.
EDIT. В EF4 используйте SqlFunctions.DateDiff
.
select col1,col2,col3 from table1
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4
Я хочу преобразовать этот sql-запрос в LINQ. но я не знаю альтернативы DateDiff в LINQ. можете ли вы предложить мне?
Вы ищете SqlMethods.DateDiffMonth
.
EDIT. В EF4 используйте SqlFunctions.DateDiff
.
Отложив в сторону ваш первоначальный вопрос на мгновение, в вашем запросе вы используете:
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4
Этот запрос всегда вызывает полное сканирование таблицы, поскольку вы сравниваете результат вызова функции с константой. Было бы намного лучше, если вы сначала вычислите свою дату, а затем сравните значение столбца с вычисленным значением, что позволит SQL использовать индекс для поиска результатов вместо того, чтобы оценивать каждую запись в вашей таблице.
Похоже, вы пытаетесь получить что-либо за последние 4 месяца, поэтому в своем коде приложения попробуйте рассчитать дату, которую вы можете сравнить с первой, и передайте это значение в выражение Linq2Entities:
DateTime earliestDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-4);
var results = from t in context.table1
where t.col3 >= earliestDate
select t;
В EF6 класс для использования DbFunctions
. См., Например, DbFunctions.DiffMonths
.
Я решил эту проблему другим способом: я вычислил дату из кода:
theDate = Date.Now.AddMonths(-4)
И в EF измените условие:
tblAccount.[State Change Date] < theDate