Как добавить день в день в Linq для SQL - PullRequest
15 голосов
/ 04 августа 2009

Я пишу этот код. Здесь dt является вводом в функцию, а также someint. Столбец 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();

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

Вот руб. Когда это попадает в SQL, я получаю ошибку:

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

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

Обновление 1

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

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

Ответы [ 10 ]

7 голосов
/ 04 апреля 2012

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

c.CMT_TS > System.Data.Objects.EntityFunctions.AddDays(e.Call.CALL_TS, 1)
4 голосов
/ 05 августа 2009

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

3 голосов
/ 06 августа 2013

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

new DateTime(t.Key.Year,t.Key.Month,T.Key.Day).AddDays(xx)
3 голосов
/ 10 июня 2013

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

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

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

Вы получите сообщение об ошибке, описанное в ОП.

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

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

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

.
3 голосов
/ 21 января 2013

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

a.Exp.Value >= new DateTimeOffset(dt).AddDays(-Convert.ToDouble(Someint))
2 голосов
/ 22 февраля 2018

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

2 голосов
/ 14 октября 2010

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

0 голосов
/ 14 мая 2019

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

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.Year,dt.Month,dt.Day,dt.Hour,dt.Minute,dt.Millisecond,0)
       select a).First();
0 голосов
/ 18 сентября 2014

Может быть хорошей идеей, если вы сначала измените свой запрос 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, вы сможете обрабатывать их более эффективно, я думаю.

Приветствия

0 голосов
/ 04 августа 2009

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

...