Linq Grouping for data Table

时间:2013-07-30 00:49:17

标签: c# linq

由于我是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”的结果。如何实现这一目标? 我尝试了很多对我不起作用的解决方案。另外,有没有办法将结果作为数据流?如果您知道任何资源,如您推荐的网站,书籍等,请告诉我。

3 个答案:

答案 0 :(得分:1)

怎么样

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

答案 1 :(得分:0)

通过你所说的你需要获得所有具有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");

答案 2 :(得分:0)

试试这个:

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

更新

如果您想忽略大小写,请尝试将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);