C# 如何将Linq中的日期添加到SQL

C# 如何将Linq中的日期添加到SQL,c#,datetime,linq-to-sql,C#,Datetime,Linq To Sql,我正在写这段代码。这里dt是函数的输入,以及someint。列Exp是一个T-SQL日期列,它通过Linq作为日期时间出现 return (from a in dataContext.TableOfA where a.name == "Test" && a.Exp.Value.AddDays(Convert.ToDouble(Someint)) >= new DateTimeOffset(dt) select a).First();

我正在写这段代码。这里dt是函数的输入,以及someint。列Exp是一个T-SQL日期列,它通过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

基思写了一个命令,像 日期部分(毫秒,10000,myDate) 已在T-SQL中受支持,自 至少是SQL Server 2000。这个错误 建议无论你使用什么数据库 正在使用的不支持 毫秒日期部分,看起来 对我来说很奇怪


请注意,我使用的是SQL Server 2008。日期数据类型不支持它。datetime支持它。

您是否考虑过编写自己的用户定义函数,该函数基本上接受int(表示天数)和date,并返回dateadd()的结果?然后将其应用到项目中的LINQ类中。然后,不调用.AddDate(),而是调用您的UDF-这将允许您保留LINQ查询中的所有内容,而无需手动拼凑SQLCommand。

我刚刚将列更改回DateTime。

如果您尝试比较两个日期,也可以使用该方法。

如果您使用实体框架,使用System.Data.Objects.EntityFunction,如下所示:

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))

这种情况在.NET4.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;

var-activeProducts=from p in db.Products where DateTime.Now()创建一个新的
DateTime
对象,然后使用
AddDays
方法:

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

如果您首先将Sql查询更改为Linq并处理Linq查询,这可能是个好主意

只需添加ToList()或limit记录

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中,我想你就可以更有效地处理了


欢迎使用:
System.Data.Entity.DbFunctions.AddDays(您的datetime,NumberOfDays)
此函数将转换为有效的SQL查询。Class
System.Data.Entity.Core.Objects.EntityFunctions
也包含AddDays函数,该函数已过时。

我解决了该查询的问题

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();

至少从SQLServer2000开始,T-SQL中就支持类似datepart(毫秒,10000,myDate)的命令。此错误表明您使用的任何数据库都不支持毫秒日期部分,这对我来说似乎很奇怪。日期数据类型不支持毫秒日期部分。datetime支持它,这更有意义。如果您可以控制DB设计,那么简单的解决方案是将此列从日期更改为日期时间。显然,如果你问这个问题,这不是你可以控制的?我使用的是.NET 4.5.1,两种情况下,你都给了我“不受LINQ支持”的错误。它说它在这里受支持,所以我需要更多信息:2019年,
EntityFunctions
被弃用。请改用
System.Data.Entity.DbFunctions