如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段
Posted
技术标签:
【中文标题】如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段【英文标题】:How to Select Multiple Fields from DataGridView using LINQ in C# WinForms 【发布时间】:2021-11-15 15:04:13 【问题描述】:技术细节:
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;
【问题讨论】:
显示一些失败的尝试 【参考方案1】:觉得我可以翻译这个:
//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 被停用时
【讨论】:
你好“Caius Jard”。谢谢您的帮助。我用要求的信息更新了我的问题。您的代码运行良好。在使用三个字段并通过“http 错误代码 = 500”进行过滤时,我尝试使用类似的方法,但它没有按预期工作。 不太清楚你的意思。如果要过滤,应将 http code = 500 放在 Where 中,而不是 Select 中。如果你把它放在选择中,你会生成一个布尔值,如果你在 DataGridView 中显示它会导致它显示一个复选框 对不起,我很笨。我做错了。我通过将“r.Cells[2].Value.Equals("500")”放入“Where”语句中来使其工作。再次感谢您的帮助。以上是关于如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?
Winforms:如何使用 C# 将图片上传到 SQL Server 数据库
如何在 C# Winforms 程序的文本框中突出显示文本?