我有以下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?
答案 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();