LINQ to Entities 4: Запрос с вычислением в предложении where - PullRequest
4 голосов
/ 08 октября 2010

У меня есть таблица со столбцом 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) не может использоваться как часть вычисления только как часть предиката, поэтому это не компилируется: 1004 *

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

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

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

1 Ответ

4 голосов
/ 08 октября 2010

Не компилируется, потому что вы сравниваете (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

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