2012-10-23 43 views
2

我们有这样的情况:我们有一个带有Date列和单独的Time列的SQL Server 2005表。当我试图查询这个表,我想这样做下面的SQL相当于:实体框架和日期+时间算术

where Date + Time > @Something

一些背景信息 - 日期存储为一个00:00的时间部分的日期,并且时间存储为具有1900-01-01日期组件的时间 - 这意味着在SQL中将这两者结合在一起可以为您提供完整的日期时间。

我知道上面有索引含义,但这不是问题所在。

你如何在LINQ中对实体做这件事?

一些其他的事情需要注意:

  • 更改数据库的架构是不可能的。
  • 这是SQL 2005所以没有Time数据类型,也没有从EF返回的TimeSpan(我曾尝试更改EF模型以尝试将其投射到TimeSpan,但没有骰子)
  • 我想尝试并坚持纯Linq-to-Entities并不会停止执行E-SQL /存储过程/ ExecuteQuery路由。

回答

0

非常蹩脚的想法,但:

var date = DateTime.Parse("2012-10-23"); 
var time = DateTime.Parse("1900-01-01 09:00:00); 
var something = date + time; 

[...] where Date + Time > something; 
+0

在LINQ到实体,你不能做这样的事情DateTime.Parse或加入红枣和日期一起。虽然可能的话,使用这样的单独调用并不是我正在寻找的;我想单个linq实体查询返回数据。 –

+0

是只有一个查询。您只需准备好您需要的数据。如果这不是你想要的,我想知道为什么这对你来说是一个问题。 – LueTm

0

实体框架(版本> 4)具有EntityFunctions类。所以,你可以这样做:

... where EntityFunctions.CreateDateTime(date.Year, date.Month, date.Day, 
      time.Hour, time.Minute, time.Second) < DateTime.Now 

或者您也可以做到这一点的老式方法:

... where date.Date < DateTime.Now.Date || (date.Date == DateTime.Now.Date && time.Time < DateTime.Now) 
+0

不幸的是,date.Year等属性不支持LINQ to entities query,也不支持.Date(在第二个片段中)。 –

+0

@DavidHusselmann - 这是EntityFunctions的目的,它允许你使用它们。 –