linq查询结果中的格式日期

以下linq to entities查询给出以下结果:

public class UserCountResult { public DateTime? date { get; set; } // **should this be string instead?** public int users { get; set; } public int visits { get; set; } } public JsonResult getActiveUserCount2(string from = "", string to = "") { var query = from s in db.UserActions group s by EntityFunctions.TruncateTime(s.Date) into g select new UserCountResult { date = g.Key, // can't use .toString("dd.MM.yyyy") here users = g.Select(x => x.User).Distinct().Count(), visits = g.Where(x => x.Category == "online").Select(x => x.Category).Count() }; return Json(query, JsonRequestBehavior.AllowGet); } 

结果:

 [{"date":"\/Date(1383433200000)\/","users":21,"visits":47},{"date":"\/Date(1383519600000)\/","users":91,"visits":236}] 

而不是像/ Date(1383433200000)/这样的东西, 我需要格式为“dd.MM.yyyy”的日期,例如

 [{"date":"29.11.2013","users":21,"visits":47},{"date":"30.11.2013","users":91,"visits":236}] 

我发现没有办法改变查询中的格式,我不知道该怎么做..我甚至不明白为什么g.Key是可以为空的…感谢任何输入!

g.Key为空,因为它是EntityFunctions.TruncateTime的签名。 http://msdn.microsoft.com/en-us/library/dd395596.aspx

要从Linq退出到实体,您可以按原样保留查询,并在事实之后将其投影:

 return Json(query.AsEnumerable().Select(r => new { date = r.date.GetValueOrDefault().ToString("dd.MM.yyyy"), users = r.users, visits = r.visits }), JsonRequestBehavior.AllowGet); 

它不漂亮,但这是Linq to Entities for you。

假设您使用JSON.NET作为JSON序列化程序,可以将JsonConverterAttribute应用于date属性以指定自定义转换器。

 [JsonConverter(typeof(MyDateConverter))] public DateTime? date { get; set; } 

您可以使用DateTimeConverterBase类作为转换器的基类。

以下是MyDateConverter的可能实现:

 class CustomDateTimeConverter : DateTimeConverterBase { private const string Format = "dd.MM.yyyy"; public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { DateTime d = (DateTime)value; string s = d.ToString(Format); writer.WriteValue(s); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { if (s == null) return null; string s = (string)reader.Value; return DateTime.ParseExact(s, Format, null); } } 

另一个选项是从序列化中排除date属性(使用JsonIgnoreAttribute ),并添加另一个String类型的属性,该属性可以转换为所需的格式。 以下是此解决方案的实现:

 public class UserCountResult { [JsonIgnore] public DateTime? date { get; set; } [JsonProperty("date")] public string DateAsString { get { return date != null ? date.Value.ToString("dd.MM.yyyy") : null; } set { date = string.IsNullOrEmpty(value) ? default(DateTime?) : DateTime.ParseExact(value, "dd.MM.yyyy", null); } } public int users { get; set; } public int visits { get; set; } } 

像这样的东西应该工作:

 date = new Date(parseInt(g.Key.substr(6))); 

substr将拉出“/ Date(”字符串, parseInt将仅拉动整数,Date将为您提供一个新的日期对象。

编辑:

刚刚发现这个支持这个答案的SO问题。

如何格式化Microsoft JSON日期?