簡體   English   中英

帶有SELECT和兩個GROUP-BY條件的LINQ查詢

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM