Как добавить день с даты в Linq to SQL

Я пишу этот код. Здесь dt вводится в функцию, а также некоторую. Столбец Exp является столбцом даты T-SQL, который приходит как DateTime через Linq.

return (from a in dataContext.TableOfA
       where a.name == "Test" &&
       a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt)
       select a).First();

В С# вы можете добавить двойной день в день к дате. Это означает, что вы можете добавить 1,5 дня. В T-SQL вы можете добавить только 1 день, а затем 12 часов. Вы должны добавить int для каждой части. Поэтому, когда Linq переводит AddDays на T-SQL, он преобразует мое количество дней в миллисекунды и добавляет их. Это позволяет ему дать всю точность, которую double дает С#.

Здесь руб. Когда это добирается до SQL, я получаю сообщение об ошибке:

Датой части миллисекунды не является поддерживается функцией даты dateadd для дата типа данных

В принципе вы не можете добавить миллисекунды к дате. Ну не шучу. Но как мне получить что-то, что переводится здесь? Я хочу добавить int days к дате. Единственное, что нужно сделать, чтобы добавить отрицательный результат к другому парню, с которым я сравниваю? Что делать, если я хотел бы сравнить с столбцами при добавлении к одному?

Обновление 1

Кит написал: Команда вроде datepart (миллисекунда, 10000, myDate) поддерживается в T-SQL, поскольку в меньшей степени SQL Server 2000. Эта ошибка предполагает, что любая база данных используют не поддерживает миллисекундная дата, которая кажется странный для меня.

Обратите внимание, что я использую SQL Server 2008. Он не поддерживается в типе данных DATE. Он поддерживается в datetime.

Ответы

Ответ 1

Я только что изменил столбец на DateTime.

Ответ 2

Если вы используете инфраструктуру Entity Framework, используйте System.Data.Objects.EntityFunctions, как показано ниже:

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)

Ответ 3

Вы можете переместить вызов на AddDays из части SQL в .NET:

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint))

Ответ 4

Похоже, что этот сценарий в основном исправлен в .NET 4.5.

Однако, если вы пишете:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.Date.AddDays(7) select p;

Вы получите то же сообщение об ошибке, что и в OP.

Но если вы пишете:

var activeProducts = from p in db.Products where DateTime.Now() <= p.EndDate.AddDays(7) select p;

Тогда вы можете войти в землю молока и меда. Обратите внимание, что я не вызывал .Date в представлении DateTime базы данных. Это, по-видимому, является краевым случаем, отсутствующим в тестовом покрытии с помощью платформы LINQ 2 SQL в версии 4.5

Ответ 5

Создайте новый объект DateTime и используйте метод AddDays после этого:

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx)

Ответ 6

Вы также можете использовать метод SqlMethods.DateDiffDay, если вы пытаетесь сравнить две даты

Ответ 7

Вы можете использовать: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays) Эта функция будет переведена в допустимый SQL-запрос. Класс System.Data.Entity.Core.Objects.EntityFunctions который также содержит функцию AddDays, является устаревшим.

Ответ 8

Рассматривали ли вы возможность написать свою собственную пользовательскую функцию, которая в основном принимает значение int (для количества дней) и даты, возвращает результаты dateadd()? Затем потяните это в класс LINQ в своем проекте. Затем вместо вызова .AddDate() вызовите ваш UDF - это позволит вам хранить все в своем запросе LINQ без необходимости вручную компилировать SQLCommand.

Ответ 9

Я решаю свою проблему с этим запросом.

return (from a in dataContext.TableOfA
       where a.name == "Test" &&
       DbFunctions.AddHours(DbFunctions.CreateDateTime(
 a.Exp.Value.Year,a.Exp.Value.Month,a.Exp.Value.Day,a.Exp.Value.Hour,a.Exp.Value.Minute,
a.Exp.Value.Millisecond),Someint) >= DbFunctions.CreateDateTimeOffset(dt)
       select a).First();

Ответ 10

Может быть, хорошая идея, если вы сначала смените свой запрос Sql на Linq и обрабатываете запрос linq.

Просто добавьте ToList() или ограничьте запись

return (from a in dataContext.TableOfA.ToList()
   where a.name == "Test" &&
   a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt)
   select a).First();

Итак, как только у вас есть все ваши вещи в Linq, вы можете обработать более эффектно, я думаю.

Приветствия