【问题标题】:Substring of a DateTime with Linq to Sql extensions带有 Linq to Sql 扩展的 DateTime 的子字符串
【发布时间】:2012-01-23 20:11:49
【问题描述】:

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

SELECT DISTINCT SUBSTRING(CONVERT(VARCHAR(50), StartTime, 120), 1, 10)

这会为表格中的每一行生成一个“yyyy-MM-dd”格式的不同日期列表。我正在尝试通过执行以下操作将其转换为 Linq-to-SQL:

query.Select(o => o.StartTime.ToString("yyyy-MM-dd")).Distinct()

但是这会导致错误“方法 'System.String ToString(System.String)' 没有支持的 SQL 转换。”

如何使用 Linq-to-SQL 执行此子字符串/转换?

谢谢!

【问题讨论】:

    标签: c# sql-server linq linq-to-sql


    【解决方案1】:

    您可以通过DateTime properties supported in LINQ to SQL 处理此问题,而不是依赖字符串处理:

    var results = query.Select(o => o.StartTime.Date).Distinct();
    

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

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

    【讨论】:

      【解决方案2】:

      我愿意:

      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 属性(去除子日期部分),因此除日期格式之外的所有内容都将在数据库上运行。

      【讨论】:

      • 这在完整的日期时间值上会有所不同,而不是在日期部分上。
      • @Jon:不,仅在 Date 部分就会有所不同。注意 Select 子句中到 DateTime.Date 的映射。
      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-23
      • 1970-01-01
      • 2016-12-08
      相关资源
      最近更新 更多