技術細節:
- Visual Studio 2017(社區版)
- LINQ
- C# (WinForms)
我正在嘗試使用 LINQ 從 datagridview 查詢資料并將其顯示在另一個 datagridview 中(原始資料源是一個文本檔案,在運行時由 datagridview 讀取)。到目前為止,我只能在選擇一個欄位時做到這一點。
例如:
欄位 2 = HTTP_CODE
欄位 5 = IP_ADDRESS
欄位 9 = 頁
欄位 11 = 用戶名
//all pages hits report var pageCountQuery = (dataGridViewIISDateTime.Rows.Cast<DataGridViewRow>() .Where(r => r.Cells[9].Value != null) .Select(r => r.Cells[9].Value) .GroupBy(pg => pg) .OrderByDescending(pg => pg.Count()) .Select(g => new { PAGE = g.Key, HITS = g.Count() })).ToList(); dataGridView1.DataSource = pageCountQuery;
和:
//IPs generating traffic report
var ipCountQuery = (dataGridViewIISDateTime.Rows.Cast<DataGridViewRow>()
.Where(r => r.Cells[5].Value != null)
.Select(r => r.Cells[5].Value)
.GroupBy(ip => ip)
.OrderByDescending(ip => ip.Count())
.Select(g => new { IP_ADDRESS = g.Key, VISITS = g.Count()})).ToList();
dataGridView1.DataSource = ipCountQuery;
但是,當我嘗試使用與上述相同的代碼選擇兩個或三個欄位時,我開始收到一些關于語法錯誤、變數超出范圍等的警告。
以下是我正在嘗試做的事情(SQL):
選擇兩個欄位的示例:
//all pages hits and the IPs hitting them report
select page, ip, count(page)
from [LogFileName]
group by page, ip
order by count(page) desc
我嘗試了以下(錯誤的方法):
//var pagesIPCountQuery = (dataGridViewIISDateTime.Rows.Cast<DataGridViewRow>()
//.Where(r => r.Cells[5].Value != null && r.Cells[9].Value != null)
//.Select(r => r.Cells[5].Value, r.Cells[9].Value)
//.GroupBy(ip => ip, page => page)
//.OrderByDescending(ip => ip.Count(), page => page.Count())
//.Select(g => new { IP = g.Key, Count = g.Count() }, { Page = })).ToList();
//dataGridView1.DataSource = pagesIPCountQuery;
選擇三個欄位的示例:
//500 errors per page and user report
SELECT username, page, http
FROM [LogFileName]
WHERE http = 500
GROUP BY username, page, http
ORDER BY count(http) DESC
我嘗試了以下操作,但我在 HTTP_CODE 欄位上看到了一個復選框,并且它沒有按錯誤 500 過濾結果:
var error500Query = (dataGridViewIISDateTime.Rows.Cast<DataGridViewRow>()
.Where(r => r.Cells[9].Value != null && r.Cells[2].Value != null && r.Cells[11].Value != null)
.Select(r => new { Page = r.Cells[9].Value, HTTP = r.Cells[2].Value.Equals("500"), Username = r.Cells[11].Value })
.GroupBy(usernamepagehttp => usernamepagehttp)
.OrderByDescending(g => g.Count())
.Select(g => new { USERNAME = g.Key.Username, PAGE = g.Key.Page, HTTP_CODE = g.Key.HTTP, HITS = g.Count() })).ToList();
dataGridView1.DataSource = error500Query;
uj5u.com熱心網友回復:
認為我可以翻譯這個:
//all pages hits and the IPs hitting them report
select page, ip, count(page)
from [LogFileName]
group by page, ip
order by count(page) desc
作為
var pageCountQuery = (dataGridViewIISDateTime.Rows.Cast<DataGridViewRow>()
.Where(r => r.Cells[9].Value != null && r.Cells[5].Value != null)
.Select(r => new { Page = r.Cells[9].Value, IP = r.Cells[5].Value })
.GroupBy(pageip => pageip)
.OrderByDescending(g => g.Count())
.Select(g => new { PAGE = g.Key.Page, IP = g.Key.IP, HITS = g.Count() })).ToList();
你還沒有說 HTTP 代碼在哪一列。但是你發布的第二個 SQL 有語法錯誤,只能在 MySQL 中真正作業,即使這樣也只有在 ONLY_FULL_GROUP_BY 被停用時
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/357980.html
