数据表的Linq分组

本文关键字:分组 Linq 数据表 | 更新日期: 2023-09-27 18:25:22

因为我是LINQ的新手,正在为以下数据表编写组查询:

DataTable dt = new DataTable("Files");
dt.Columns.AddRange(new DataColumn[] { 
    new DataColumn("ID", typeof(int)), 
    new DataColumn("FileName", typeof(string)), 
    new DataColumn("ParentID", typeof(int)) 
} );
dt.Rows.Add(1, "File1.Jpg", 1);
dt.Rows.Add(2, "File2.jpg", 1);
dt.Rows.Add(3, "File3.jpg", 1);
dt.Rows.Add(4, "File3.jpg", 1);
dt.Rows.Add(5, "File4.jpg", 1);
dt.Rows.Add(6, "File3.jpg", 2);

对于给定的parentID=1,我需要"file3.jpg"的结果。我怎样才能做到这一点?我尝试了很多对我不起作用的解决方案。还有,有没有办法把结果作为数据行?。如果你知道你推荐的网站、书籍等资源,请告诉我。

数据表的Linq分组

怎么样

DataRow dr = dt.AsEnumerable()
                 .Where(x => Convert.ToInt32(x("ID")) == 3 && 
                             Convert.ToInt32(x("ParentID")) == 1)
                 .FirstOrDefault();

根据您所说的,您需要获取parentID=1和FileName=file3.jpg的所有值。如果是这种情况,您可以使用DataView,根据您的示例,您有2条具有这些值的记录(id为3和4的记录),因此要使用DataView获取这些值,您可以执行以下操作:

            DataView dv = new DataView(dt); //dt is your datatable.
            dv.RowFilter = "ParentID = '1' AND FileName = 'File3.jpg'";
            for (int i = 0; i < dv.Count; i++)
            {
                Console.WriteLine(dv[i]["ID"] + " - " + dv[i]["FileName"]);
            }

编辑:

如果只是使用linq并获得第一个"File3.jpg"作为数据行:

DataRow dr = dt.AsEnumerable().FirstOrDefault(r => r["ParentID"].ToString() == "1" && r["FileName"].ToString() == "File3.jpg");

试试这个:

var rows = dt.AsEnumerable()
             .Where(x => (int)x["ParentID"] == 1)
             .GroupBy(x => x["FileName"]).Where(x=>x.Count() > 1)
             .Select(x => x.Key);

更新

如果您想忽略case,请尝试将StringComparer.CurrentCultureIgnoreCase作为第二个参数添加到GroupBy<...>中,如下所示:

var rows = dt.AsEnumerable()
             .Where(x => (int)x["ParentID"] == 1)
             .GroupBy<DataRow,string>(x => x["FileName"].ToString(), StringComparer.CurrentCultureIgnoreCase)
             .Where(x=>x.Count() > 1)
             .Select(x => x.Key);