2010-10-08 5 views
4

J'ai une table avec une colonne DateTime "TimeStamp" et une colonne int "TimeoutSeconds". Je veux récupérer tous les enregistrements de cette table où DateTime.Now - TimeStamp> TimeoutSeconds. Dans un proc stocké ce fut une évidence à l'aide GetDate():LINQ to Entities 4: Requête avec calcul dans where clause

select * from Schema.TableName mp 
where (GetDate() - mp.[Timestamp]) > mp.Timeout 

Cependant, avec Entity Framework en utilisant soit la syntaxe LINQ ou Lambda Je ne peux pas le faire, car il semble que la variable d'entrée Lambda (mp) ne peut pas être utilisé comme partie d'un calcul que dans le cadre d'un prédicat, donc cela ne compile pas:

var records = context.TableName.Where(mp => (DateTime.Now - mp.TimeStamp) > mp.Timeout); 

cela ne compile pas.

Je ne veux pas récupérer la totalité de la table puis effectuer mon filtrage en mémoire et je préfère ne pas utiliser un proc stocké ou Entity SQL. Quelles sont mes options ici?

+0

Quelle erreur obtenez-vous? Quels sont les types de TimeStamp et Timeout? –

Répondre

4

Ceci ne compile pas parce que vous comparez (DateTime.Now - mp.TimeStamp) qui a le type de retour System.TimeSpan à int. La première solution qui vient à l'esprit est de faire

Where(mp => (DateTime.Now - mp.TimeStamp) > new TimeSpan(0, 0, 0, mp.Timeout)) 

Malheureusement, cela ne semble pas fonctionner dans EF, donc si vous avez MS SQL Server comme base de données, vous pouvez utiliser SqlFunctions dans EF4:

var records = context. 
       TableName. 
       Where(mp => System.Data.Objects.SqlClient.SqlFunctions. 
          DateDiff("s", mp.TimeStamp, DateTime.Now) > mp.Timeout); 

http://msdn.microsoft.com/en-us/library/dd487052.aspx