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