DATEDIFF (в месяцах) в linq - PullRequest
       2

DATEDIFF (в месяцах) в linq

12 голосов
/ 01 апреля 2011
select col1,col2,col3 from table1 
where(DATEDIFF(mm, tblAccount.[State Change Date], GETDATE()) <= 4

Я хочу преобразовать этот SQL-запрос в LINQ.но я не знаю никакой альтернативы DateDiff в LINQ.не могли бы вы предложить мне?

Ответы [ 4 ]

13 голосов
/ 01 апреля 2011

Вы ищете SqlMethods.DateDiffMonth.

РЕДАКТ. : В EF4 используйте SqlFunctions.DateDiff.

8 голосов
/ 01 апреля 2011

Отложив на время свой исходный вопрос, в своем запросе вы используете:

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;
6 голосов
/ 24 апреля 2014

В EF6 используется класс DbFunctions.См., Например, DbFunctions.DiffMonths.

0 голосов
/ 23 марта 2016

Я решил эту проблему по-другому: я вычислил дату из кода:

theDate = Date.Now.AddMonths(-4)

И в EF измените условие:

tblAccount.[State Change Date] < theDate
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...