-2

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

4

3 回答 3

1

怎么样

DataRow dr = dt.AsEnumerable()
                 .Where(x => Convert.ToInt32(x("ID")) == 3 && 
                             Convert.ToInt32(x("ParentID")) == 1)
                 .FirstOrDefault();
于 2013-07-30T00:51:34.107 回答
0

尝试这个:

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

更新

如果您想忽略大小写,请尝试将 aStringComparer.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);
于 2013-07-30T03:17:42.623 回答
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");
于 2013-07-30T01:30:19.707 回答