views:

5773

answers:

3

If I have a Linq to SQL expression like this:

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

I want this to to use the SQL Servers GETDATE() function instead of the time of the machine running the C# program.

The next question would be how to translate

DateTime.Now.AddDays(2)

to

DATEADD(dd, 2, GETDATE())
A: 

You could use the ExecuteQuery to gain full control of the sql http://weblogs.asp.net/scottgu/archive/2007/08/27/linq-to-sql-part-8-executing-custom-sql-expressions.aspx

I know it seems like very little gain (or perhaps on the contrairy) over ADO.NET though.

Per Hornshøj-Schierbeck
Well... then it isn't a LINQ expression ;-)
Thomas Jespersen
true :) but if linq2sql is supposed to be an abstraction over sql you shouldn't be able to use an sql function in the first place? :P
Per Hornshøj-Schierbeck
+2  A: 

If you don't mind querying the database before every use, I would suggest the following workaround: Use ExecuteQuery in one place to get the date in the data context like this:

public partial class YourDataContext
{
  public DateTime GetDate()
  {
    return ExecuteQuery<DateTime>("SELECT GETDATE()").First();
  }
}

and then you can write

from subscription in dbContext.Subscriptions
where subscription > dbContext.GetDate().AddDays(2)
select subscription
Panos
+14  A: 

Try 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: this needs to be a part of your DataContext class.

Now you can use GetSystemDate() instead of DateTime.Now in your queries. As for date differences take a look at System.Data.Linq.SqlClient namespace, especially DayDiffXXX functions of SqlMethods class.

liggett78
Note: this gets translated directly into GETDATE() function, e.g. no separate calls to SQL Server. Just verified it.
liggett78