【问题标题】:LINQ query with SELECT and two GROUP-BY condition带有 SELECT 和两个 GROUP-BY 条件的 LINQ 查询
【发布时间】:2011-12-12 18:16:05
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,为什么要将结果作为数据表?
  • 我需要循环结果,所以我想将结果移动到一个新的数据表并与之交互
  • 为什么不直接查看结果,跳过数据表部分?
  • “循环结果”是什么意思? DataTable 是较旧的技术。您似乎不太可能需要使用它。
  • 在 StackOverflow,当你说“一些错误”时,总会有人说:什么错误?我认为它刚刚发生。

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


【解决方案1】:

就您的第一个问题而言。 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 上的说明进行操作。

【讨论】:

    【解决方案2】:

    我一直在使用 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);
    

    我想计算出在某一天发生了每种类型的操作数。注意 eventdate 存储为格式为 yyyy-mm-dd hh:MM:ss 的字符串。这是为了简化 c#、JSON 和 Jquery 之间的转换(如果需要,我使用 活动日期。

    有些人会认为这是低效的,但我更喜欢将进程拆分为一组非常简单的连续操作,以便于调试并帮助其他人遵循我的代码。这就是为什么有 2 个 Linq 查询。

    querya 从 eventdate 中剔除时间组件 这确保了我们以后的分组是按天进行的,而不是按秒进行的。为了更加确定没有缓存,我在一个名为 actionday 的新字段中创建它。我还将动作重命名为活动,因为智能感知变得混乱!其他列按原样复制。

    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 & activity上分组,创建新列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
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-15
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多