【问题标题】:Convert datetime2 to string("dd/MM/yyyy") in LINQ在 LINQ 中将 datetime2 转换为字符串(“dd/MM/yyyy”)
【发布时间】:2016-12-31 01:12:47
【问题描述】:

我在数据库中有一个 datetime2 列。我正在尝试从数据库中获取它,我想在视图中将其显示为字符串。

我试过了:dt.ToString("dd/MM/yyyy");

但它给出了一个错误。

EntityFramework.SqlServer.dll 中出现“System.NotSupportedException”类型的异常,但未在用户代码中处理

附加信息:LINQ to Entities 无法识别方法“System.String ToString(System.String)”方法,并且该方法无法转换为存储表达式。

我也试过String.Format("{0:y yy yyy yyyy}", dt);,即使这样也报错了。

【问题讨论】:

  • 它给出了什么错误?
  • 请告诉我错误?

标签: c# asp.net asp.net-mvc linq type-conversion


【解决方案1】:

你可以查看这个网站:click here

DateTime dt = new DateTime(2008, 3, 9, 16, 5, 7, 123);

String.Format("{0:y yy yyy yyyy}", dt);  // "8 08 008 2008"   year
String.Format("{0:M MM MMM MMMM}", dt);  // "3 03 Mar March"  month
String.Format("{0:d dd ddd dddd}", dt);  // "9 09 Sun Sunday" day
String.Format("{0:h hh H HH}",     dt);  // "4 04 16 16"      hour 12/24
String.Format("{0:m mm}",          dt);  // "5 05"            minute
String.Format("{0:s ss}",          dt);  // "7 07"            second
String.Format("{0:f ff fff ffff}", dt);  // "1 12 123 1230"   sec.fraction
String.Format("{0:F FF FFF FFFF}", dt);  // "1 12 123 123"    without zeroes
String.Format("{0:t tt}",          dt);  // "P PM"            A.M. or P.M.
String.Format("{0:z zz zzz}",      dt);  // "-6 -06 -06:00"   time zone

并且基本上,在 entityframework 中不知道如何将 System.Threading.Tasks.Task 的对象转换为 SQL 语句。您可以使用:

SqlFunctions.StringConvert(dt)

或者在使用 tostring() 之前,使用 .tolist():

.ToList().select(p=>new{date=dt.ToString()});

【讨论】:

  • 您应该在 allclient 参数中检索主列,并在另一个参数中使用 allclient.tolist().select(p=>new{purchaseDt=String.Format("{0:y yy yyy yyyy} ",k.PurchaseDate)});
  • 我无法在 allclient 的 PurchaseDt 中将 DateTime 列值作为字符串获取??
  • 正如我之前所说,EF 不知道如何将 C# 方法转换为 SQL 代码。 :(
  • 好的,我可以在 allclient 中有另一个字符串变量,在 foreach 循环中转换字符串日期格式并将其添加到该变量。对吗?
  • 是的,您可以使用 foreach 循环。这是另一种方式。
【解决方案2】:

在您发布屏幕截图后,我想我意识到了您的问题。某些函数不允许在 inside linq 中运行,因为 linq 需要将它们转换为 sql。

由于我无法复制粘贴您的代码和我的修改(您需要在 linq 语句外部执行日期格式设置,无论是使用 foreach 循环还是任何其他方法)。 一个粗略的想法:

allclient = (from ....
             select new AllClient()
             {
              ...
              PurchaseDT = "",
              PurchaseDate = k.PurchaseDate, //the formatting will be done later
             }
foreach (AllClient c in allclient)
      c.PurchaseDT = String.Format("{0:y yy yyy yyyy}", c.PurchaseDate); //or whatever other formatting you want

其中PurchaseDate 是DateTime 类型,PurchaseDT 是字符串类型。

首先将来自 db 的值保存到 datetime 变量中,然后使用 foreach 循环遍历列表,将 datetime 变量转换为字符串并将其分配给字符串变量。

更新

如果可以的话,唯一的方法是向 AllClient 类添加一个变量。这将是一个用于临时存储日期的 DateTime,另一个是字符串(如上面的代码 sn-p 所示),它将在 linq 语句之后使用格式化的日期进行更新。

保留一个 DateTime PurchaseDT,而不是在 linq 中或之后立即对其进行格式化,仅在显示时对其进行格式化。 例如,如果您在某种表格上显示记录,同时显示日期列,请在 PurchaseDT 上进行格式化。

【讨论】:

  • 它给出一个错误“日期时间不包含值的定义。”
  • 这里还有另一个问题.. 如果 PurchaseDT 是 DateTime 类型,它将在 LINQ 中给出错误。如果它是一个字符串,它将在 foreach 循环中出错。
  • 更新了,在linq中,给它一个值“”,这样你就可以把它保存为字符串,以后仍然可以更新。
  • 根据您的更新,它将尝试在 foreach 循环中将空字符串转换为 dd/MM/yyyy 格式的字符串。
【解决方案3】:

试试这个:

dt.ToString("d");

请注意:“d”格式是文化感知的,但它为您提供短日期模式。

【讨论】:

    【解决方案4】:
    DateTime dt = DateTime.ParseExact(<datetime string from db>, <format of date in Datetime string from db>, CultureInfo.InvariantCulture);
    string formattedDate = dt.ToString("dd/MM/yyyy",CultureInfo.InvariantCulture);
    

    首先您必须将日期时间字符串转换为 DateTime 对象,然后您可以转换为所需的格式。您使用的ToString 的重载对DateTime 对象有效,对String 对象无效。这就是错误的原因

    【讨论】:

      【解决方案5】:

      您可以将其用于视图:

      @model.RegisteredDate.ToString("dd MMMM , yyyy")
      

      这将给出21 August , 2016 的格式。
      如果您推荐21 Aug , 2016,则只需使用“MMM”

      【讨论】:

      • 是的,只需使用@model.RegisteredDate.ToString("dd / MM / yyyy")
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-30
      • 2018-05-19
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-24
      相关资源
      最近更新 更多