实体中的 Nullable<DateTime> 导致我的 linq 表达式出现问题
Nullable<DateTime> in entity causes issues in my linq expression
这是此方法的 InnerException:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
下面是产生这个异常的方法。我相信这与 Created_Date
和 Modified_Date
列 datetime?
有关
我已经尝试过多种方式来执行此操作,您可以通过下面的代码看出 role.Is_Active 也是一个可为空的列,但是没有遇到任何问题。
public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
{
using (var context = new SmartWarehouseEntities())
{
var roles = context.Security_Role
.Where(role => role.Is_Active == active)
.Select(role => new Models.DTO.Role
{
SecurityRoleId = role.Security_Role_Id,
RoleName = role.Role_Name,
RoleDetail = role.Role_Detail,
IsActive = role.Is_Active ?? false,
Created = role.Created_Date.HasValue ? role.Created_Date.Value : DateTime.MinValue,
Modified = role.Modified_Date.HasValue ? role.Created_Date.Value : DateTime.MinValue
})
.Take(limit);
return roles.ToArray();
}
}
编辑(已解决):
感谢大家的意见,以下是我根据评论和回答解决问题的步骤。
角色模型(更新为接受可空):
public class Role
{
public int SecurityRoleId { get; set; }
public string RoleName { get; set; }
public string RoleDetail { get; set; }
public bool IsActive { get; set; }
public DateTime? Created { get; set; }
public string CreatedDate => !Created.HasValue
? string.Empty
: Created.Value.ToString(CultureInfo.InvariantCulture);
public DateTime? Modified { get; set; }
public string ModifiedDate => !Modified.HasValue
? string.Empty
: Modified.Value.ToString(CultureInfo.InvariantCulture);
}
获取角色方法:
public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
{
using (var context = new SmartWarehouseEntities())
{
var roles = context.Security_Role
.Where(role => role.Is_Active == active)
.Select(role => new Models.DTO.Role
{
SecurityRoleId = role.Security_Role_Id,
RoleName = role.Role_Name,
RoleDetail = role.Role_Detail,
IsActive = role.Is_Active ?? false,
Created = role.Created_Date,
Modified = role.Modified_Date
})
.Take(limit);
return roles.ToArray();
}
}
不及格DateTime.MinValue
。现在是 0001 年 1 月 1 日,它小于 SQL 服务器 datetime
(1/1/1753) 的最小值。除非您正在处理可以追溯到那么远的历史数据,否则您可以为 1/1/1753 这样的值创建自己的常量并使用它。
DateTime.MaxValue
没问题,因为对于 .NET 类型和 SQL 服务器,它都是 12/31/9999。
更多时候我们只是使用 datetime2
作为我们在 SQL 服务器中的类型。
在 sql 服务器中你有(至少)两个 DateTime
类型:
- 日期时间:1753/01/01 到时间结束
- datetime2: 0001/01/01 到时间结束
每个这种类型都可以绑定到 .Net DateTime
,但 DateTime.MinValue
始终是 0001/01/01。因此,将 sql 列配置为日期时间后,sql 服务器会在您尝试编写 DateTime.MinValue
.
时争辩
所以你可以:
- 在数据库级别更改您的模型以使用 datetime2,或者
- 更改您的代码以不使用
DateTime.MinValue
还有其他的考虑比如DateTime2 vs DateTime in SQL Server
这是此方法的 InnerException:
SqlDateTime overflow. Must be between 1/1/1753 12:00:00 AM and 12/31/9999 11:59:59 PM.
下面是产生这个异常的方法。我相信这与 Created_Date
和 Modified_Date
列 datetime?
我已经尝试过多种方式来执行此操作,您可以通过下面的代码看出 role.Is_Active 也是一个可为空的列,但是没有遇到任何问题。
public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
{
using (var context = new SmartWarehouseEntities())
{
var roles = context.Security_Role
.Where(role => role.Is_Active == active)
.Select(role => new Models.DTO.Role
{
SecurityRoleId = role.Security_Role_Id,
RoleName = role.Role_Name,
RoleDetail = role.Role_Detail,
IsActive = role.Is_Active ?? false,
Created = role.Created_Date.HasValue ? role.Created_Date.Value : DateTime.MinValue,
Modified = role.Modified_Date.HasValue ? role.Created_Date.Value : DateTime.MinValue
})
.Take(limit);
return roles.ToArray();
}
}
编辑(已解决):
感谢大家的意见,以下是我根据评论和回答解决问题的步骤。
角色模型(更新为接受可空):
public class Role
{
public int SecurityRoleId { get; set; }
public string RoleName { get; set; }
public string RoleDetail { get; set; }
public bool IsActive { get; set; }
public DateTime? Created { get; set; }
public string CreatedDate => !Created.HasValue
? string.Empty
: Created.Value.ToString(CultureInfo.InvariantCulture);
public DateTime? Modified { get; set; }
public string ModifiedDate => !Modified.HasValue
? string.Empty
: Modified.Value.ToString(CultureInfo.InvariantCulture);
}
获取角色方法:
public IEnumerable<Models.DTO.Role> GetRoles(bool active = true, int limit = 10)
{
using (var context = new SmartWarehouseEntities())
{
var roles = context.Security_Role
.Where(role => role.Is_Active == active)
.Select(role => new Models.DTO.Role
{
SecurityRoleId = role.Security_Role_Id,
RoleName = role.Role_Name,
RoleDetail = role.Role_Detail,
IsActive = role.Is_Active ?? false,
Created = role.Created_Date,
Modified = role.Modified_Date
})
.Take(limit);
return roles.ToArray();
}
}
不及格DateTime.MinValue
。现在是 0001 年 1 月 1 日,它小于 SQL 服务器 datetime
(1/1/1753) 的最小值。除非您正在处理可以追溯到那么远的历史数据,否则您可以为 1/1/1753 这样的值创建自己的常量并使用它。
DateTime.MaxValue
没问题,因为对于 .NET 类型和 SQL 服务器,它都是 12/31/9999。
更多时候我们只是使用 datetime2
作为我们在 SQL 服务器中的类型。
在 sql 服务器中你有(至少)两个 DateTime
类型:
- 日期时间:1753/01/01 到时间结束
- datetime2: 0001/01/01 到时间结束
每个这种类型都可以绑定到 .Net DateTime
,但 DateTime.MinValue
始终是 0001/01/01。因此,将 sql 列配置为日期时间后,sql 服务器会在您尝试编写 DateTime.MinValue
.
所以你可以:
- 在数据库级别更改您的模型以使用 datetime2,或者
- 更改您的代码以不使用
DateTime.MinValue
还有其他的考虑比如DateTime2 vs DateTime in SQL Server