【问题标题】:How to Select Multiple Fields from DataGridView using LINQ in C# WinForms如何在 C# WinForms 中使用 LINQ 从 DataGridView 中选择多个字段
【发布时间】: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;

【问题讨论】:

  • 显示一些失败的尝试

标签: c# winforms linq datagridview


【解决方案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”语句中来使其工作。再次感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-06
  • 2010-11-15
  • 1970-01-01
  • 2015-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多