1

Datatable以下 SQL 查询的等效 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);
    }
4

2 回答 2

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>where T is DataRow(即类似的查询table1.AsEnumerable().Where(r => r.cod_time == "A011")),那么您可以只使用DataTableExtensions.CopyToDataTable扩展方法。但是,由于您的查询返回匿名类型,因此您必须按照MSDN上的这些说明进行操作。

于 2011-12-20T09:32:57.293 回答
0

我一直在使用 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 之间的转换(如果需要,我在代码的其他地方使用 eventdate.

有些人会认为这是低效的,但我更喜欢将进程拆分为一组非常简单的连续操作,以便于调试并帮助其他人遵循我的代码。这就是为什么有 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
};
于 2012-05-29T14:56:01.087 回答