如何使用Linq-to-Entities在SQL Server 2008中查询时间戳?

3

我在SQL Server 2008中有一个timestamp列。

现在我需要使用从日历服务器控件选择的日期查询该列。

我们假设我有一个DateTime dt对象;

我需要通过这个datetime对象过滤,返回所有记录在那个日期(dt)上记录的结果。

   var a = DateTime.Now.ToString();
   var IsDone = from d in _le.diets
                 where d.log_time.Contains(a)
                 select d.done;

_le是一个私有的实体框架对象。
以下代码存在问题:

错误 3 'byte[]'不包含定义为“Contains”的方法,而最佳扩展方法重载'System.Linq.ParallelEnumerable.Contains(System.Linq.ParallelQuery, TSource)'具有一些无效的参数 f:\tests\diet\diet\DataTier\DietMovieRepository.cs 30 32 diet

错误 2 无法将lambda表达式转换为类型“string”,因为它不是委托类型 f:\tests\diet\diet\DataTier\DietMovieRepository.cs 30 26 diet

错误 1 委托'System.Func'不接受1个参数 f:\tests\diet\diet\DataTier\DietMovieRepository.cs 30 26 diet

错误 4 实例参数:无法将“byte []”转换为“System.Linq.ParallelQuery” f:\tests\diet\diet\DataTier\DietMovieRepository.cs 30 32 diet

我是EF的初学者,感谢您的帮助!
更新:
在EF cs文件中,我看到
   public static diet Creatediet(global::System.Int64 id, global::System.Boolean done, global::System.Byte[] log_time)
        {
            diet diet = new diet();
            diet.id = id;
            diet.done = done;
            diet.log_time = log_time;
            return diet;
        }
2个回答

3

SQL Server中的“时间戳”与时间无关(实际上,“时间戳”的名称现在已被标记为弃用;应使用相同的“rowversion”代替)。

如果您真的有一个“时间戳”,那么这是不可能的。如果您有一个设置为插入时间的日期时间,那么这应该很简单:

DateTime start = date.Date, end = start.AddDays(1);

...
where row.log_time >= start && row.log_time < end
...

另外,如果您主要进行日期范围搜索,log_time 可能是聚集索引的一个合适候选项。或者,如果您正在进行基于天数的查询,则在代表自纪元起过去天数的整数上创建非聚集索引也可以。


2016年至今,当您使用EntityFramework生成带有rowversion的表时,它仍然使用时间戳。 - Po-ta-toe

0
假设你只想查看日期部分?那么你应该可以做一些类似这样的事情:
   var a = DateTime.Now;
   var isDone = from d in _le.diets
                 where d.log_time.Date == a.Date
                 select d.done;

谢谢您的回答,但是看起来我无法获取d.log_time.Date。因为log_time是数据库中的时间戳。 - user469652
哦,好的,log_time是什么类型?它是TimeSpan吗? - Phill
我的意思是在模型中。它生成为二进制。我不确定你如何对其进行查询,抱歉。:( - Phill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接