Ответ 1
Я только что изменил столбец на DateTime.
Я пишу этот код. Здесь 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.
Я только что изменил столбец на DateTime.
Если вы используете инфраструктуру Entity Framework, используйте System.Data.Objects.EntityFunctions, как показано ниже:
c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)
Вы можете переместить вызов на AddDays
из части SQL в .NET:
a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint))
Похоже, что этот сценарий в основном исправлен в .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
Создайте новый объект DateTime
и используйте метод AddDays
после этого:
new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx)
Вы также можете использовать метод SqlMethods.DateDiffDay, если вы пытаетесь сравнить две даты
Вы можете использовать: System.Data.Entity.DbFunctions.AddDays(YourDateTime, NumberOfDays)
Эта функция будет переведена в допустимый SQL-запрос. Класс System.Data.Entity.Core.Objects.EntityFunctions
который также содержит функцию AddDays, является устаревшим.
Рассматривали ли вы возможность написать свою собственную пользовательскую функцию, которая в основном принимает значение int (для количества дней) и даты, возвращает результаты dateadd()? Затем потяните это в класс LINQ в своем проекте. Затем вместо вызова .AddDate() вызовите ваш UDF - это позволит вам хранить все в своем запросе LINQ без необходимости вручную компилировать SQLCommand.
Я решаю свою проблему с этим запросом.
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();
Может быть, хорошая идея, если вы сначала смените свой запрос 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, вы можете обработать более эффектно, я думаю.
Приветствия