带有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);
    }

带有SELECT和两个GROUP-BY条件的LINQ查询

关于你的第一个问题。与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
};