Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将SQLServer中的varchar(20)转换为C中的datetime?_C#_Sql Server_Entity Framework - Fatal编程技术网

C# 如何将SQLServer中的varchar(20)转换为C中的datetime?

C# 如何将SQLServer中的varchar(20)转换为C中的datetime?,c#,sql-server,entity-framework,C#,Sql Server,Entity Framework,我将日期作为varchar存储在SQLServer中,以便它们在C逐实体框架中成为字符串 然后我尝试将其转换为date,但代码引发了一个异常 在SQL Server中: CREATE TABLE [dbo].[Achievements] ( ... [DatePerformance] [VARCHAR](20) NULL, ) 日期以以下格式存储:2019年4月25日 在C中: 我试过: List<Achievements> res = db.Ach

我将日期作为varchar存储在SQLServer中,以便它们在C逐实体框架中成为字符串

然后我尝试将其转换为date,但代码引发了一个异常

在SQL Server中:

CREATE TABLE [dbo].[Achievements]
(
      ...   
      [DatePerformance] [VARCHAR](20) NULL, 
)
日期以以下格式存储:2019年4月25日

在C中:

我试过:

List<Achievements> res = db.Achievements.Where(x =>  DateTime.Parse(x.DatePerformance) <= DateTime.Today.Date).ToList();
以及:

代码抛出:

System.NotSupportedException:'LINQ to Entities无法识别方法'System.DateTime ParseSystem.String'方法,并且无法将此方法转换为存储表达式。'


正如其他人在评论中所说,在SQL中将日期存储为varchar的好理由是零

你说:

所以它们在C的实体框架中变成了字符串

一旦你在C中得到了日期,你就可以用一个.ToString轻松地完成这个任务

但是。。。至于您的特定错误,它告诉您的是,您不能在实体框架LINQ语句中使用此方法。最好将LINQ语句视为查询。因为,事实上,它需要能够将LINQ语句转换为实际的SQL查询。不能在SQL查询中使用DateTime.Parse,因此它会抛出此错误

如果您真的必须将日期作为varchar存储在数据库中,这是一个糟糕的想法,那么我看不到一个真正简单的解决方案。马上,我会告诉您首先创建列表,然后循环浏览:

List<Achievements> res = db.Achievements.ToList();
然后:


但这是一种非常笨拙的解决方案:只需将日期存储为日期

修正你的数据模型!不要将日期作为字符串存储在数据库中。使用这个秘密和难以猜测的日期来存储它们。这些[时态]数据类型的存在有很多原因,其中一个原因是它们恰恰阻止了您现在正在处理的问题:在没有自然表示的数据类型中表示的重要性ISO-8601是一种标准表示,但与数值相比仍然是任意的。将日期存储为字符串会产生许多问题,例如国际化问题、排序问题,当然还有您正在处理的这个问题。将它们存储为日期,这将为您省去许多麻烦。您无法使用该字符串格式搜索日期范围,也无法确保所有字符串的格式相同。另一方面,日期值是只需要3个字节的二进制值,排序工作与预期一样,索引很容易,并且无法插入无效日期。没有理由将日期存储为字符串。在SQL Server中,您可以使用try\u convert。如果转换失败,它将返回NULL而不是抛出错误。例如选择try_convertdate,'25/04/2019',103。。。
List<Achievements> res = db.Achievements.Where(x =>   DateTime.ParseExact(x.DatePerformance, "dd/MM/yyyy",
 CultureInfo.InvariantCulture) <= DateTime.Today.Date).ToList();
List<Achievements> res = db.Achievements.ToList();
foreach (var achievement in res)
{
   if (DateTime.Parse(achievement.DatePerformance)  <= DateTime.Today.Date)
   {
       // do something here
   }
}