C# 带有Linq到Sql扩展的DateTime的子字符串

C# 带有Linq到Sql扩展的DateTime的子字符串,c#,sql-server,linq,linq-to-sql,C#,Sql Server,Linq,Linq To Sql,我试图从我的表中获取一个日期列表,该表在名为StartTime的列中包含许多DateTime值。我的前任使用了以下SQL: SELECT DISTINCT SUBSTRING(CONVERT(VARCHAR(50), StartTime, 120), 1, 10) 这将为表中的每一行生成“yyyy-MM-dd”格式的不同日期列表。我尝试通过执行以下操作将其转换为Linq到SQL: query.Select(o => o.StartTime.ToString("yyyy-MM-dd")).

我试图从我的表中获取一个日期列表,该表在名为StartTime的列中包含许多DateTime值。我的前任使用了以下SQL:

SELECT DISTINCT SUBSTRING(CONVERT(VARCHAR(50), StartTime, 120), 1, 10)
这将为表中的每一行生成“yyyy-MM-dd”格式的不同日期列表。我尝试通过执行以下操作将其转换为Linq到SQL:

query.Select(o => o.StartTime.ToString("yyyy-MM-dd")).Distinct()
但是,这会导致错误“方法”System.String ToString(System.String)“不支持转换为SQL。”

如何使用Linq将子字符串/转换为SQL

谢谢

我会:

query.Select(o => o.StartTime.Date)
     .Distinct() // Runs on the database
     .AsEnumerable() // Convert to local sequence
     .Select(date => date.ToString("yyyy-MM-dd")) // Runs on the client

LINQ to SQL中支持
DateTime.Date
属性(去掉子日期部分),因此除了日期格式之外的所有内容都将在数据库中运行

您可以通过以下方式处理此问题,而不是依赖字符串处理:

如果要将其视为字符串,稍后可以使用LINQ to Objects转换结果:

var stringResults = results.AsEnumerable().Select(d => d.ToString("yyyy-MM-dd"));

这在完整的日期时间值上是不同的,而不是在日期部分。@Jon:不,它仅在日期部分上是不同的。请注意Select子句中到DateTime.Date的映射。
var stringResults = results.AsEnumerable().Select(d => d.ToString("yyyy-MM-dd"));