通过简单日期SQL过滤到Linq语法

时间:2015-10-22 15:13:31

标签: c# linq

我有以下SQL和结果:

SELECT EventTime FROM Incidents
-- RESULT --
2015-10-20 00:00:00.000
2015-10-20 05:00:00.000
2015-10-20 05:50:00.000
2015-10-20 07:00:00.000
2015-10-20 09:00:30.000
2015-10-21 05:00:00.000
2015-10-21 06:10:00.000
2015-10-22 09:10:00.000

我使用以下SQL按明日期过滤(SQL 2014):

SELECT DISTINCT CONVERT (Date, [EventTime]) AS EventDate FROM Incidents
-- RESULT --
EventDate
2015-10-20
2015-10-21
2015-10-22

在SQL中非常容易。对于LINQ,我尝试逻辑:

var q = db.TimeLines.Select(x => x.Time.Date).Distinct();
// show it
q.ToList().ForEach(x => { Console.WriteLine("EventDate: {0}", x); });

打破:附加信息:指定的类型成员'日期' LINQ中不支持...

...如何在LINQ中编写第二个SQL?

1 个答案:

答案 0 :(得分:1)

如果在使用不能翻译成sql的运算符之前将查询更改为列表,那么它将起作用。

NSLog

但是你需要在获得日期的日期部分之前进行转换,而不是之后。

修改

在这种情况下,我不确定您是否会获得任何性能提升,但正如juharr在下面的评论中所提到的,如果您希望查询保持懒惰,请使用AsEnumerable。

var q = db.TimeLines.ToList.Select(x => x.Time.Date).Distinct();
// show it
q.ForEach(x => { Console.WriteLine("EventDate: {0}", x); });

编辑2:

如果要在SQL服务器上完全运行查询,可以使用var q = db.TimeLines.AsEnumerable.Select(x => x.Time.Date).Distinct(); 作为可翻译函数:

DbFunctions.TruncateTime

编辑3: 此外,谢尔盖是关于我的第一个例子,如果这样做,你应该在转储到内存之前选择你想要的东西:

var q = db.TimeLines.Select(x => DbFunctions.TruncateTime(x.Time)).Distinct();