Сгенерированный T-SQL из LINQ to SQL выполняет DATEPART - PullRequest
1 голос
/ 22 октября 2010

Следующий запрос LINQ to SQL разбивает дату на части.Кажется странным, что при сравнении дат будет использоваться следующий сгенерированный оператор SQL.

var customers = 
(from c in db.customers
 where c.servhists.Any(sh => sh.donedate.Value.Date >= startDate.Date
                && sh.donedate.Value.Date <= endDate.Date
                && sh.donedate.Value.AddDays(triggerDays).Date <= DateTime.Now.Date)

создает следующий запрос SQL для MS SQL Server 2008

...

WHERE (DATEADD(HOUR, -DATEPART(HOUR, [t3].[donedate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t3].[donedate]), DATEADD(SECOND, -DATEPART(SECOND, [t3].[donedate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t3].[donedate]), [t3].[donedate])))) >= '6/7/2010') AND (DATEADD(HOUR, -DATEPART(HOUR, [t3].[donedate]), DATEADD(MINUTE, -DATEPART(MINUTE, [t3].[donedate]), DATEADD(SECOND, -DATEPART(SECOND, [t3].[donedate]), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, [t3].[donedate]), [t3].[donedate])))) <= '8/8/2010') AND (DATEADD(HOUR, -DATEPART(HOUR, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000)) / 86400000, [t3].[donedate]))), DATEADD(MINUTE, -DATEPART(MINUTE, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000)) / 86400000, [t3].[donedate]))), DATEADD(SECOND, -DATEPART(SECOND, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000)) / 86400000, [t3].[donedate]))), DATEADD(MILLISECOND, -DATEPART(MILLISECOND, DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000)) / 86400000, [t3].[donedate]))), DATEADD(ms, (CONVERT(BigInt,3 * 86400000)) % 86400000, DATEADD(day, (CONVERT(BigInt,3 * 86400000)) / 86400000, [t3].[donedate])))))) <= '10/22/2010')

.. donedate - это обнуляемый столбец типа DateTime

Не могу себе представить, что это сильно влияет на производительность.Кто-нибудь может предложить исправление / исправление, которое я мог бы сделать, чтобы избавиться от этого уродливого SQL?

1 Ответ

1 голос
/ 03 марта 2012

Созданный вами SQL является результатом того, как использование свойства Date в столбце отображается в SQL с помощью LINQ.Измените математику даты, чтобы избежать использования свойства Date и других операций с датой в самом столбце.Вместо этого выполняйте как можно больше математических операций с датой над переменной, которую вы сравниваете со столбцом.

var customers = (from c in db.customers
                 where c.servhists.Any(sh => sh.donedate.Value >= startDate.Date
                                       && sh.donedate.Value < endDate.Date.AddDays(1)
                                       && sh.donedate.Value <= DateTime.Now.AddDays(0 - triggerDays).Date)

Возможно, потребуется дополнительная настройка, поэтому сравните результаты, полученные с известной вам, сдо переключения.Этого должно быть достаточно, чтобы дать вам идею.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...