7

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

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 可以为空..感谢您的任何输入!

4

4 回答 4

11

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。

于 2013-11-04T22:49:29.160 回答
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; }
}
于 2013-11-04T22:46:32.633 回答
2

像这样的东西应该工作:

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

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

编辑:

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

如何格式化 Microsoft JSON 日期?

于 2013-11-04T22:46:07.240 回答
2

如果这是使用 SQL Server,您可以连接 SQL 函数的结果

using System.Data.Entity.SqlServer;    

...

date = SqlFunctions.DatePart("year",g.Key)
    +"-"+SqlFunctions.DatePart("month",g.Key)
    +"-"+SqlFunctions.DatePart("day",g.Key)
于 2019-01-14T19:18:13.697 回答