以下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是可以为空的...感谢任何输入!
答案 0 :(得分:10)
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。
答案 1 :(得分:4)
假设您使用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; }
}
答案 2 :(得分:1)
这样的事情应该有效:
date = new Date(parseInt(g.Key.substr(6)));
substr
将取消“/ Date(”字符串,parseInt
将仅提取整数,而Date将为您提供新的日期对象。
修改强>
刚刚发现这个支持这个答案的SO问题。
答案 3 :(得分:0)
如果使用的是SQL Server,则可以合并SQL函数的结果
using System.Data.Entity.SqlServer;
...
date = SqlFunctions.DatePart("year",g.Key)
+"-"+SqlFunctions.DatePart("month",g.Key)
+"-"+SqlFunctions.DatePart("day",g.Key)