【问题标题】:Changing DateTime format in lambda Expression更改 lambda 表达式中的 DateTime 格式
【发布时间】:2018-01-27 00:54:32
【问题描述】:

我有一个 DateTime 格式的 DTO 字段

public DateTime date_joined { get; set; }

我用它把数据变成一个Json

public JsonResult Customer(int? id)
        {
            var user = User.Identity.Name;
            if (!AccountController.IsInRole(user, "admin"))
            {
                return null;
            }

            id = id == null ? 0 : id;

            var customer = db.PrmCustomers
                .Where(x => x.EmailAddress != null && x.CustomerID > id)
                .OrderBy(x => x.CustomerID)
                .Select(x => new CustomerDTO()
                {
                    email = x.EmailAddress,
                    phone = x.MobilePhoneNumber,
                    username = "",
                    first_name = x.Name,
                    last_name = x.Surname,
                    gender = x.GenderType,
                    customer_code = x.CustomerID,
                    is_active = "",
                    //date_joined = String.Format("{0:d/M/yyyy HH:mm:ss}", x.CreateDate.ToString()),
                    date_joined = x.CreateDate,
                    last_login = "",
                    date_of_birth = x.BirthDate,
                    //date_of_birth = String.Format("{0:d/M/yyyy HH:mm:ss}", x.BirthDate.ToString()),
                    password = x.Password,
                    email_allowed = x.IsNewsletter,
                    sms_allowed = x.IsSms,
                    verified = x.IsApprovedEmail,
                    social_account_facebook_uuid = "",
                    social_account_facebook_extra = ""
                });

            return Json(customer, JsonRequestBehavior.AllowGet);
        }

问题是,它是这样出现的

"date_joined":"\/Date(1516965473683)\/"

我尝试将其更改为另一种格式,但我无法管理它。

首先我尝试了通常的 DateTime 格式为toString("newFOrmat"),但我得到了 Linq 错误,主要是因为在SQL Server 中无法识别 toString()

然后我遇到了这个问题format date in linq query result并在那里尝试了这个方法

return Json(customer.AsEnumerable().Select(r=>new CustomerDTO{
                date_joined = r.date_joined.GetValueOrDefault().ToString("dd.MM.yyyy")
            }) , JsonRequestBehavior.AllowGet);

我收到“DateTime 没有 GetValueOf() 的定义”错误,尽管我包含了正确的命名空间。

省略它并仅使用通常的 ToString("format") 会导致上述 Linq 错误。

还有其他建议吗?

编辑:我的 DTO 和输出也有其他字段。我没有将它们包括在问题中。

【问题讨论】:

  • 在我看来,这种日期格式来自转换为 JSON。请参阅 Json.Net 文档中的 this page
  • 我不知道你为什么使用JsonResult,但如果这是 Web API(2 或核心),你可以轻松更改代码样式,这样你就不必担心任何 Json(反)序列化更多。

标签: c# linq datetime lambda


【解决方案1】:

我认为您最好的办法是通过调用 .ToList() 从数据库中加载所需的数据,然后将该数据映射到您的 DTO。
确保将 DTO 上的类型从 DateTime 更改为 string

类似这样的:

public JsonResult Customer(int? id)
    {
        var user = User.Identity.Name;
        if (!AccountController.IsInRole(user, "admin"))
        {
            return null;
        }

        id = id == null ? 0 : id;

        var customer = db.PrmCustomers
            .Where(x => x.EmailAddress != null && x.CustomerID > id)
            .OrderBy(x => x.CustomerID).ToList()  //  <-- ToList executes the query
            .Select(x => new CustomerDTO()
            {
                email = x.EmailAddress,
                phone = x.MobilePhoneNumber,
                username = "",
                first_name = x.Name,
                last_name = x.Surname,
                gender = x.GenderType,
                customer_code = x.CustomerID,
                is_active = "",
                date_joined = x.CreateDate.ToString("d/M/yyyy HH:mm:ss"),
                //date_joined = x.CreateDate,
                last_login = "",
                //date_of_birth = x.BirthDate,
                date_of_birth = x.BirthDate.ToString("d/M/yyyy HH:mm:ss"),
                password = x.Password,
                email_allowed = x.IsNewsletter,
                sms_allowed = x.IsSms,
                verified = x.IsApprovedEmail,
                social_account_facebook_uuid = "",
                social_account_facebook_extra = ""
            });

        return Json(customer, JsonRequestBehavior.AllowGet);
    }

【讨论】:

  • 谢谢,虽然我也需要将 DTO 的类型更改为字符串,但它仍然有效。完成了工作:)
  • 我认为,这不是解决问题的正确方法。您可以修改您的 web api json 序列化程序设置以保持所需的格式。
【解决方案2】:

所以你基本上需要调用一个数据库函数来将你的日期转换为一个字符串。

有一个很棒的库可以帮助将数据库函数和存储过程映射到实体框架。

我将下面的代码更改为或多或少需要的代码,这些代码对我有用,可以将字符串转换为 int。因此,更改为 DateTime 函数时可能会出现一些小错误。

你也许可以考虑映射SQL的“格式”函数,然后你就可以从linq传递日期格式,但在下面的例子中,我假设你在SQL中创建了一个名为DATE_TO_STRING的函数

安装 Nuget 包

- Install-Package EntityFramework.Functions

为函数创建扩展方法:

public static class SQLFunctions
{
   [Function(FunctionType.BuiltInFunction, "DATE_TO_STRING")]
   public static string SqlDateToString(this DateTime value) => Function.CallNotSupported<string>();
}

将其映射到您的 EntityFramework 上下文中:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Conventions.Add(new FunctionConvention(typeof(SQLFunctions)));
}

在 LINQ 查询中调用新映射的“SqlDateToString()”函数:

.Select(p => p.YourDateColumn.SqlDateToString());

和你的叔叔鲍勃。

另一种选择是改用 MomentJs,它可以很好地理解 json 日期格式,然后你就不需要这个映射的东西了。

【讨论】:

    【解决方案3】:

    我不喜欢接受的答案; 我建议你扩展 JsonResult (谷歌搜索你可以找到许多使用这种方法的帖子)并覆盖 ExecuteResult 方法:

    public class JsonNetResult : JsonResult
    {
      public object Data { get; set; }
    
      public JsonNetResult()
      {
      }
    
      public override void ExecuteResult(ControllerContext context)
      {
         HttpResponseBase response = context.HttpContext.Response;
         response.ContentType = "application/json";
         if (ContentEncoding != null)
             response.ContentEncoding = ContentEncoding;
         if (Data != null)
         {
              JsonTextWriter writer = new JsonTextWriter(response.Output) { Formatting = Formatting.Indented };
              JsonSerializer serializer = JsonSerializer.Create(new JsonSerializerSettings());
              serializer.Serialize(writer, Data);
              writer.Flush();
         }
      }
    }
    

    最后:

    return new JsonNetResult() { Data = customer };
    

    此代码以 ISO 格式返回日期

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 1970-01-01
      相关资源
      最近更新 更多