LINQ to Entities 4: запрос с вычислением в предложении where

У меня есть таблица со столбцом DateTime "TimeStamp" и столбцом int "TimeoutSeconds". Я хочу получить все записи из этой таблицы, где DateTime.Now - TimeStamp > TimeoutSeconds. В хранимой процедуре это было несложно использовать GetDate():

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

Однако с Entity Framework, использующим синтаксис LINQ или Lambda, я не могу этого сделать, потому что кажется, что входная переменная Lambda (mp) не может использоваться как часть вычисления только как часть предиката, поэтому это не компилируется:

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

Это не компилируется.

Я не хочу извлекать всю таблицу, а затем выполнять фильтрацию в памяти и предпочел бы не использовать хранимую процедуру или Entity SQL. Каковы мои варианты здесь?


person MrLane    schedule 08.10.2010    source источник
comment
Какая у вас ошибка ? Какие бывают типы TimeStamp и Timeout?   -  person Thomas Levesque    schedule 08.10.2010


Ответы (1)


Это не компилируется, потому что вы сравниваете (DateTime.Now - mp.TimeStamp) с типом возврата System.TimeSpan с int. Первое решение, которое приходит на ум, это сделать

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

К сожалению, это не работает в EF, поэтому, если у вас есть MS SQL Server в качестве базы данных, вы можете использовать SqlFunctions в 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

person Yakimych    schedule 08.10.2010