[英]LINQ query with SELECT and two GROUP-BY condition
以下SQL查询的Datatable
的等效LINQ指令是什么:
SELECT code_direction, count(TP) AS CN
FROM table1
WHERE cod_time = 'A011'
GROUP BY TP,code_direction;
以及如何将结果放入新的数据表中?
我尝试将其转换,但存在一些错误。 有人可以看一下:
var query = from t in table1.AsEnumerable()
group t by new { t.TP, t.code_direction }
into grp
select new
{
grp.Key.code_direction,
CN = grp.Count(t.TP)
};
foreach (var x in query)
{
Console.Write(x.code_direction);
Console.Write(x.CN);
}
就您的第一个问题而言。 相当于SQL查询的LINQ是:
var query = from t in table1.AsEnumerable()
where t.cod_time == "A011"
group t by new { t.TP, t.code_direction }
into grp
select new
{
grp.Key.code_direction,
CN = grp.Count()
};
请注意,您不必将任何参数传递给grp.Count()
。 (由于显而易见的原因,在SQL中COUNT(TP)与COUNT(*)相同,即只计算行数。如果您使用COUNT(DISTINCT TP)或类似的话,情况可能会有所不同。)
就第二个问题而言,如果您的查询刚刚返回了IEnumerable<T>
,其中T是DataRow
(即,诸如table1.AsEnumerable().Where(r => r.cod_time == "A011")
)可能只是DataTableExtensions.CopyToDataTable
扩展方法。 但是,当查询返回匿名类型时,您将必须遵循MSDN上的这些说明。
我一直在使用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);
我想弄清楚在一天中每种类型发生了多少次动作。 NB eventdate以字符串形式存储,格式为yyyy-mm-dd hh:MM:ss。 这是为了简化c#,JSON和Jquery之间的转换(在需要的地方,我使用eventdate在代码的其他位置创建DateTime对象。
有人会说这是低效的,但是我更喜欢将流程分成一系列真正简单的操作,以简化调试并帮助其他人遵循我的代码。 那就是为什么有2个Linq查询的原因。
querya从事件日期中删除时间成分,这可以确保我们以后的分组按天而不是按秒进行。 为了确保没有缓存,我在一个名为actionday的新字段中创建了缓存。 我也将动作重命名为活动,因为智能感知变得困惑了!! 其他列按原样复制。
var querya =
from c in customobject.rows
select new { actionday = c.eventdate.Substring(0, 10), activity = c.action, c.userid,
c.eventdate };
/ * queryb产生一组查询a的计数,按动作日和活动分组,创建新列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
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.