我一直在使用 LINQ 处理从远程共享点 Web 服务返回的 JSON 对象。我发布这个是因为我在网上找到的大多数答案都与我需要的略有不同。
从远程共享点列表返回日常活动的 json 列表,然后使用 LINQ 进行汇总
自定义对象定义的简化版本如下所示(& 在 MVC 应用程序的模型区域中定义)
public class MyCustomObjectList
{
public string eventdate { get; set; }
public string userid { get; set; }
public string action { get; set; }
}
JSON 对象被序列化为 MyCustomObjectList 数组。
var customobject = serializer.Deserialize<MyCustomObjectList>(jsonobject);
我想计算出在某一天发生了多少每种类型的动作。注意 eventdate 存储为格式为 yyyy-mm-dd hh:MM:ss 的字符串。这是为了简化 c#、JSON 和 Jquery 之间的转换(如果需要,我在代码的其他地方使用 eventdate.
有些人会认为这是低效的,但我更喜欢将进程拆分为一组非常简单的连续操作,以便于调试并帮助其他人遵循我的代码。这就是为什么有 2 个 Linq 查询。
querya 从 eventdate 中剔除时间组件,这确保我们以后的分组按天进行,而不是按秒进行。为了更加确定没有缓存,我在一个名为 actionday 的新字段中创建它。我还将动作重命名为活动,因为智能感知变得混乱!其他列按原样复制。
var querya =
from c in customobject.rows
select new { actionday = c.eventdate.Substring(0, 10), activity = c.action, c.userid,
c.eventdate };
/* queryb 生成 querya 的分组计数,按 actionday 和 activity 分组,创建新列 actionkey、ActionCount、Dte、action 和 DetailList(这是用于调试目的的摘要)*/
var queryb=
from p in querya group p by new { p.actionday, p.activity} into idGroup
actionkey = idGroup.Key,
ActionCount = idGroup.Count(),
Dte = idGroup.Key.actionday,
action = idGroup.Key.activity,
DetailList = idGroup
};
这是一个由 3 列汇总的版本
var queryc = from p in querya
group p by new { p.actionday, p.userid, p.activity} into idGroup
select new
{
actionday = idGroup.Key,
ActionCount = idGroup.Count(),
userid = idGroup.Key.userid,
Dte = idGroup.Key.actionday,
action = idGroup.Key.activity,
DetailList = idGroup
};