使用SELECT和两个GROUP-BY条件的LINQ查询

时间:2011-12-12 18:16:05

标签: c# linq datatable linq-to-dataset

以下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);
    }

2 个答案:

答案 0 :(得分:1)

就你的第一个问题而言。 LINQ等效的SQL查询是:

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上的说明进行操作。

答案 1 :(得分:0)

我一直在使用LINQ处理从远程sharepoint Web服务返回的JSON对象。我发布了这个,因为我在网上找到的大多数答案与我需要的答案略有不同。

从远程共享点列表&amp;中返回日常活动的json列表。然后使用LINQ

进行汇总

自定义对象定义的简化版本如下所示(&amp;在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和amp;之间的转换。 Jquery(需要我在代码中的其他位置创建DateTime对象使用 活动日期。

有些人认为这是低效的,但为了便于调试,我更喜欢将流程拆分为一系列非常简单的操作。帮助其他人关注我的代码。这就是为什么有2个Linq查询。

querya从eventdate中删除时间组件这确保我们以后的分组按日发生,&amp;不是秒。为了更加确定没有缓存,我在一个名为actionday的新字段中创建它。我还将动作重命名为活动,因为intellisense感到困惑!其他列按原样复制。

var querya =
from c in customobject.rows
select new {  actionday =  c.eventdate.Substring(0, 10), activity =  c.action, c.userid,
c.eventdate };

/ * queryb生成一个分组的查询计数,按行动日和时间分组。活动,创建新列actionkey,ActionCount,Dte,action&amp; 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
};