Добавить дату в Linq для сущностей - PullRequest
8 голосов
/ 03 ноября 2010

С Linq to Entities я пытаюсь запросить таблицу журнала, чтобы найти строки рядом с соответствующей строкой. У меня проблемы с добавлением даты внутри запроса. Это то, что я имею до сих пор.

from
    l in objectSet.Logs
let
    match = objectSet.Logs.Where(whatever).FirstOrDefault()
where
       l.Timestamp > (match.Timestamp - twoHours)
    && l.Timestamp < (match.Timestamp + twoHours)
select
    l

Если исключить условие «что угодно», которое находит интересующую меня строку, то «twoHours» было переменным промежутком времени, функцией .AddHours() и так далее. Я не нашел правильного способа, которым EF может генерировать SQL, который добавляет значение из поля (match.Timestamp) к константе.

Очевидное решение состоит в том, чтобы сначала выполнить запрос «сопоставить», а затем использовать литеральное значение во втором запросе, но я упростил приведенный здесь пример кода до основной проблемы (добавление дат в запросе) и фактически запрос является более сложным, и это не было бы идеально.

Приветствия

Ответы [ 3 ]

11 голосов
/ 03 ноября 2010

Вы можете сгенерировать AddHours, используя EntityFunctions class .

from
    l in objectSet.Logs
let
    match = objectSet.Logs.Where(whatever).FirstOrDefault()
where
       (l.Timestamp > EntityFunctions.AddHours(match.Timestamp, -1 * twoHours))
    && // ...
select
    l

Однако , не ожидайте, что это WHERE будет оптимизировано с индексом, если у вас нет индекса выражения в столбце.

3 голосов
/ 04 сентября 2014

EntityFunctions устарела в пользу DbFunctions

public int GetNumUsersByDay(DateTime Date)
        {
            using (var context = db)
            {
                var DateDay = new DateTime(Date.Year, Date.Month, Date.Day);
                var DateDayTomorrow = DateDay.AddDays(1);
                return context.Users.Where(m => DbFunctions.AddHours(m.DateCreated,-5) >= DateDay && m.DateCreated < DateDayTomorrow).Count();
            }
        }
0 голосов
/ 17 декабря 2010

Как было описано в этой статье - http://www.devart.com/blogs/dotconnect/?p=2982#first, использовать параметры (объявить переменную) вместо DateTime с использованием в ваших запросах.

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