繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM