Как использовать SQL GETDATE() и DATEADD() в выражении Linq to SQL?
Если у меня есть выражение Linq
to SQL
, как это:
from subscription in dbContext.Subscriptions
where subscription.Expires > DateTime.Now
select subscription
Я хочу, чтобы это использовало функцию SQL Servers GETDATE()
вместо времени, когда машина работала с программой C#
.
Следующий вопрос заключается в следующем:
DateTime.Now.AddDays(2)
:
DATEADD(dd, 2, GETDATE())
Ответы
Ответ 1
Попробуйте this:
[Function(Name="GetDate", IsComposable=true)]
public DateTime GetSystemDate()
{
MethodInfo mi = MethodBase.GetCurrentMethod() as MethodInfo;
return (DateTime)this.ExecuteMethodCall(this, mi, new object[]{}).ReturnValue;
}
EDIT: это должно быть частью вашего класса DataContext.
Теперь вы можете использовать GetSystemDate() вместо DateTime.Now в ваших запросах.
Что касается различий даты, посмотрите пространство имен System.Data.Linq.SqlClient, особенно функции DayDiffXXX класса SqlMethods.
Ответ 2
Если вы не возражаете запросить базу данных перед каждым использованием, я бы предложил следующее обходное решение: используйте ExecuteQuery в одном месте, чтобы получить дату в контексте данных следующим образом:
public partial class YourDataContext
{
public DateTime GetDate()
{
return ExecuteQuery<DateTime>("SELECT GETDATE()").First();
}
}
а затем вы можете написать
from subscription in dbContext.Subscriptions
where subscription > dbContext.GetDate().AddDays(2)
select subscription
Ответ 3
Вы можете использовать ExecuteQuery, чтобы получить полный контроль над sql http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx
Я знаю, что это похоже на очень небольшой выигрыш (или, возможно, на contrairy) по сравнению с ADO.NET, хотя.