带有SELECT和两个GROUP-BY条件的LINQ查询
本文关键字:条件 GROUP-BY LINQ 查询 两个 SELECT 带有 | 更新日期: 2023-09-27 18:17:31
以下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从远程sharepoint web服务返回的JSON对象上工作。我把这个贴出来,是因为我在网上找到的大多数答案与我需要的略有不同。
从远程sharepoint列表返回一个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之间的转换。(在需要的地方,我在代码的其他地方使用eventdate。
有些人会认为这是低效的,但我更喜欢将进程分割成一系列真正简单的操作,为了更容易调试&帮助其他人遵循我的准则。这就是为什么有2个Linq查询。
querya从eventdate中去掉时间组件,这确保我们以后的分组是按天进行的,&一秒钟都不行。为了确保没有缓存,我在一个名为actionday的新字段中创建了它。我还将action重命名为activity,因为智能感知变得混乱了!!其他列按原样复制。
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 &活动,创建新的列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
};