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日期?