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