Как я могу использовать SQL GETDATE () и DATEADD () в выражении Linq to SQL? - PullRequest
27 голосов
/ 14 октября 2008

Если у меня есть выражение от Linq до SQL, подобное этому:

  from subscription in dbContext.Subscriptions
 where subscription.Expires > DateTime.Now
select subscription

Я хочу использовать функцию SQL Server GETDATE() вместо времени машины, на которой запущена программа C#.

Следующий вопрос будет, как перевести это:

DateTime.Now.AddDays(2)

к этому:

DATEADD(dd, 2, GETDATE())

Ответы [ 3 ]

43 голосов
/ 14 октября 2008

Попробуйте это :

[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.

6 голосов
/ 14 октября 2008

Если вы не возражаете обращаться к базе данных перед каждым использованием, я бы предложил следующий обходной путь: используйте 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
0 голосов
/ 14 октября 2008

Вы можете использовать ExecuteQuery, чтобы получить полный контроль над SQL http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

Я знаю, что, похоже, очень мало (или, возможно, наоборот) выигрыша в ADO.NET.

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