Есть ли альтернатива DateTime.Ticks или DateTime.TimeOfDay в Linq-To-Entities? - PullRequest
3 голосов
/ 19 июля 2010

Я пишу парсер журналов для веб-приложения asp.net mvc2.Я использую Entity Framework в качестве модели, и ведение журнала выполняется как с использованием моего ручного движка, так и с помощью функции CDC SqlServer2008.

При вставке или редактировании строки в базе данных действие регистрируется.Однако существует небольшая задержка между происходящими изменениями в реальной таблице и регистрацией этих изменений.Мне нужно отображать детали из таблиц CDC, когда пользователь нажимает на некоторые из них.Из-за вышеупомянутой задержки я не могу сравнить эквивалентность двух значений DateTime.Я хочу разрешить отставание в 2000 миллисекунд.Самый простой способ, который я знаю, - это использовать Ticks или TimeOfDay и вычитать абсолютное значение их значений, но проклятый Linq-To-Entities не позволяет эти два свойства.

Вот простая функция, с которой у меня проблемы...

        public static List<dbo_Object_CT> GetLogDetails (Int32 objectID, DateTime? actionDateAndTime)
    {
        ObjectEntities oe = new ObjectEntities();

        var mylogdetails = (from objectLog in oe.dbo_Object_CT
                     join ltm in oe.lsn_time_mapping on objectLog.C___start_lsn equals ltm.start_lsn
                     where (objectLog.Id == objectID)
                     && ((actionDateAndTime == null) ? true : (Math.Abs(actionDateAndTime.Value.Ticks - ltm.tran_begin_time.Value.Ticks) < 2000))
                     select objectLog).ToList();

        return mylogdetails;
    }

Я знаю, что мог бы вручную сделать предложение "где", но оно было бы большим, уродливым и медленным.У кого-нибудь есть лучшие предложения?

Ответы [ 2 ]

4 голосов
/ 19 июля 2010

Посмотрите на EF Канонические функции и Специфичные для SQL Server функции .Вот пара руководств по использованию этих функций: Как: вызывать канонические функции (LINQ to Entities) Как: вызывать функции базы данных (LINQ to Entities) Здесь вы можете найти некоторую информацию о классе EntityFunctions.

0 голосов
/ 19 июля 2010

А как насчет

((TimeSpan) (actionDateAndTime.Value - ltm.tran_begin_time.Value)).Milliseconds > 2000 

Производит SQL что-то вроде

(CONVERT(Int,(CONVERT(BigInt,(CONVERT(BigInt,(((
 CONVERT(BigInt,DATEDIFF(DAY, t1, t2))) 
 * 86400000) 
 + DATEDIFF(MILLISECOND, DATEADD(DAY, DATEDIFF(DAY, t1, t2), t1), t2)) 
 * 10000)) / 10000)) % 1000)) 

Не знаю, как заставить LINQ производить sql как

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