【问题标题】:'TimeOfDay' is not supported in LINQ to Entities - Find total seconds in Linq 2 SQLLINQ to Entities 不支持“TimeOfDay” - 在 Linq 2 SQL 中查找总秒数
【发布时间】:2015-09-24 08:21:57
【问题描述】:

当我执行以下操作时:

[EdmFunction("Edm", "TruncateTime")]
public static DateTime? TruncateDateTime(DateTime? inputDate)
{
    return inputDate.HasValue ? inputDate.Value.Date : (DateTime?)null;
}

 [EdmFunction("Edm", "TotalSeconds")]
public static double? GetTotalSeconds(DateTime? inputDate)
{
    return inputDate.HasValue ? inputDate.Value.TimeOfDay.TotalSeconds: (double?)null;
}

var employeeSelection = (from c in MyContext.Employees.Where(c => c.From.HasValue && c.To.TimeOfDay.TotalSeconds != 0)
...
select new Employee

{


 To = c.To != DateTime.MinValue && c.To.TimeOfDay.TotalSeconds != 0 ? TruncateDateTime(c.To).Value :
              c.To != DateTime.MinValue && c.To.TimeOfDay.TotalSeconds == 0 ? c.From.Value.AddMinutes(30) :  DateTime.MinValue

}

我明白了:

附加信息:指定类型成员'TimeOfDay'不是 在 LINQ to Entity 中支持。只有初始化器、实体成员和 支持实体导航属性。

当我尝试这个时:

var employeeSelection = (from c in MyContext.Employees.Where(c => c.From.HasValue && GetTotalSeconds(c.To) != 0)
...
select new Employee

{


 To = c.To != DateTime.MinValue && GetTotalSeconds(c.To) != 0 ? TruncateDateTime(c.To).Value :
              c.To != DateTime.MinValue && GetTotalSeconds(c.To) == 0 ? c.From.Value.AddMinutes(30) :  DateTime.MinValue

}

我明白了:

附加信息:指定的方法 'System.Nullable1[System.Double] GetTotalSeconds(System.Nullable1[System.DateTime])' 关于类型 'GetDateRangeMethod' 无法转换为 LINQ to Entities 存储表达式。

如何在 Linq to SQL 中找到总秒数?

谢谢

【问题讨论】:

标签: c# entity-framework linq datetime timespan


【解决方案1】:

尝试使用SqlFunctions.DatePart

例如而不是

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && GetTotalSeconds(c.To) != 0)

试试类似的东西

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && SqlFunctions.DatePart("second", c.To) != 0)

对于网络法师

var employeeSelection = (from c in MyContext.Employees
          .Where(c => c.From.HasValue && (SqlFunctions.DatePart("second", c.To) + (60 * SqlFunctions.DatePart("minute", c.To)) + (3600 * SqlFunctions.DatePart("hour", c.To))) != 0)

在哪里

TotalSeconds = (SqlFunctions.DatePart("second", c.To) + (60 * SqlFunctions.DatePart("minute", c.To)) + (3600 * SqlFunctions.DatePart("hour", c.To )))

【讨论】:

  • 这两个函数不是一回事。
  • @NetMage 确实不是,这是一个“有帮助”的答案,因为我展示了一种获取秒数的方法,然后扩展此答案以给出: TotalSeconds = SqlFunctions.DatePart(" second", c.To) + (60 * SqlFunctions.DatePart("minute", c.To)) + (3600 * SqlFunctions.DatePart("hour", c.To))
【解决方案2】:

查看Date and Time Canonical Functions for LINQ-to-Entities,如果您不确定如何调用它们,请查看How to: Call Canonical Functions

可用的方法应该能够解决您当前遇到的数据库不支持您当前使用的操作的问题。

【讨论】:

    【解决方案3】:

    如果您有 Linq-To-Entities 查询,您只能执行可以由您使用的数据库管理系统执行的操作。

    您需要从数据库中获取所需的信息并从该查询创建一个列表,这将称为 Linq-To-Objects,您将能够执行所需的操作。

    【讨论】:

    • 在处理成百上千条记录时,此解决方案需要很长时间。
    • 这取决于您选择的列数。您需要过滤所需的数据,而不是选择可能不需要 80% 的所有数据。
    猜你喜欢
    • 1970-01-01
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-17
    • 1970-01-01
    相关资源
    最近更新 更多