如何在 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 控件

如何在 C# 控制台或 WinForms 应用程序中使用 Windows 安全的确认证书弹出窗口选择证书?

Winforms:如何使用 C# 将图片上传到 SQL Server 数据库

如何在 C# Winforms 程序的文本框中突出显示文本?

如何在 C# Winforms 应用程序中取消执行长时间运行的异步任务

如何在 C# (Winforms) 中复制或读取假脱机文件